인프런 커뮤니티 질문&답변

idealjun님의 프로필 이미지

작성한 질문수

[C#과 유니티로 만드는 MMORPG 게임 개발 시리즈] Part4: 게임 서버

socket과 stream을 닫는 시점이 궁금합니다.

20.06.12 21:53 작성

·

217

0

안녕하세요. 강의 잘 보고 있습니다. 

클라이언트 측에서  TcpClient로 생성한 socket과 stream의 해제 시점이 궁금해서 질문 남깁니다.

TcpClinet socket = new TcpClient(Ip, Port);

var stream = socket.GetStream();

Request();    // 서버로 한번 요청 보냄.

Response() ; // 서버로부터 응답받음.

// 이후 500ms 간격으로 요청없이도 응답이 계속 옴.

.

.

1. 위와 같이 [요청->응답->응답...] 식으로 한번만 요청하면  이후 지속적으로 특정단위의 데이터가 응답이 되는 시스템의 경우,

클라이언트에서는 소켓을 일단 닫고 다시 열어야  하나요, 아니면 이 경우에는 소켓을 닫을 필요가 없는건가요?

2. 덧붙여  [요청->응답->요청->응답 ...] 이 500ms로 계속 반복되는 경우에는 해제 시점이 언제일까요?

위의 2가지 경우 모두 socket과 스트림을 해제를 하지 않으면 StackOveflowException이 발생할 거 같은데, 

해제를 안해도 되는지, 해야된다면 시점이 언젠지 궁금합니다.

답변 1

1

Rookiss님의 프로필 이미지
Rookiss
지식공유자

2020. 06. 13. 12:04

1. 클라에서 소켓을 닫으면, 서버에서 더 이상 클라한테 메시지를 보낼 수 없게 됩니다.
그러니 게임 TCP 통신 방식에서는 처음에 소켓 연결이 이루어지면,
네트워크 연결이 필요한 동안엔 쭉 들고 있어야 합니다.

2. StackOverflow는 말 그대로 스택 버퍼가 다 찼을 때 발생하는 것이고,
주로 memcpy등 C++ 복사 실수나, 재귀함수 과다 호출로 인한 StackFrame 초과 등의 대표적 이유가 있습니다.
네트워크 요청/응답에서 한 번 보내고/수신 처리한 데이터는 영구적으로 유지되지 않을뿐더러
특별히 스택에서 관리되는 데이터도 아니라서 StackOverflow랑은 크게 연관이 없습니다.

보통 MSDN 예제에서는 네트워크 연결해서 데이터 한 번 보내고 종료하는 간단한 루틴으로 이루어져 있으니
데이터를 보낸 다음에 바로 리소스 정리를 해주지만,
게임처럼 장기간 유지되는 프로그램에선, 정말 프로그램이 종료되기 전에만 정리를 해주시면 됩니다.

idealjun님의 프로필 이미지

작성한 질문수

질문하기