클라이언트 측에서 네트워크 연결을 비활성화 할 때 CSocket은 OnClose 또는 OnReceive를 수신하지 않습니다.
-
19-09-2019 - |
문제
C ++ CSocket을 사용하여 클라이언트 서버 응용 프로그램을 만들었습니다. 클라이언트를 서버에 연결 한 후 일반 X 버튼으로 클라이언트를 닫거나 TaskManager로 작업을 종료하면 Server Csocket은 OnClose 이벤트를 수신합니다. 문제는 클라이언트가 실행중인 Windows에서 인터넷 연결을 비활성화 할 때 Server Csocket이 OnClose 또는 OnReceive 이벤트를 수신하지 않습니다!
무슨 일이 일어나고 있는지 아는 사람이 있습니까?
업데이트 : 방금 테스트했는데 클라이언트가 OnClose도받지 못한 것을 보았습니다! 클라이언트가 실행중인 Windows에서 인터넷 연결을 비활성화했습니다!
해결책
클라이언트 측은 FIN 또는 RST를 통해 서버에 대한 연결을 닫을 수 없으며 종료됩니다. 서버가 클라이언트가 죽었다는 것을 감지하려면 보낼 데이터가 있어야하거나 (실패 할 것인지)주기적인 TCP KeepAlive 프로브를 보내야합니다. TCP_KEEPALIVE
소켓 옵션으로 설정할 수 있습니다.
제휴하지 않습니다 StackOverflow