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

idealjun님의 프로필 이미지
idealjun

작성한 질문수

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

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

작성

·

232

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
지식공유자

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

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

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

idealjun님의 프로필 이미지
idealjun

작성한 질문수

질문하기