20.06.12 21:53 작성
·
230
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
2020. 06. 13. 12:04
1. 클라에서 소켓을 닫으면, 서버에서 더 이상 클라한테 메시지를 보낼 수 없게 됩니다.
그러니 게임 TCP 통신 방식에서는 처음에 소켓 연결이 이루어지면,
네트워크 연결이 필요한 동안엔 쭉 들고 있어야 합니다.
2. StackOverflow는 말 그대로 스택 버퍼가 다 찼을 때 발생하는 것이고,
주로 memcpy등 C++ 복사 실수나, 재귀함수 과다 호출로 인한 StackFrame 초과 등의 대표적 이유가 있습니다.
네트워크 요청/응답에서 한 번 보내고/수신 처리한 데이터는 영구적으로 유지되지 않을뿐더러
특별히 스택에서 관리되는 데이터도 아니라서 StackOverflow랑은 크게 연관이 없습니다.
보통 MSDN 예제에서는 네트워크 연결해서 데이터 한 번 보내고 종료하는 간단한 루틴으로 이루어져 있으니
데이터를 보낸 다음에 바로 리소스 정리를 해주지만,
게임처럼 장기간 유지되는 프로그램에선, 정말 프로그램이 종료되기 전에만 정리를 해주시면 됩니다.