클라이언트 프로그램에서 WM_CLOSE메시지가 오면 소켓이 INVALID_SOCKET이 아닌 경우 closesocket 후 INVALID_SOCKET으로 초기화를 시켜주고 WSACleanup을 호출하고 종료하는데 서버 접속자 명단을 확인해보면 같은 아이피에서 여러 세션(이 단어가 맞는건가..)으로 접속중이더라구요
불필요하다고 생각해서 중복 실행 방지를 해뒀고 코드 가상화를 해둬서 우회를 했을 확률은 매우 낮은데 그럼 클라이언트가 종료돼도 소켓이 남아있다는 소리같은데
원인이 무엇이고 어떻게 해결해야되나요?
참고로 서버단에서는 FD_CLOSE가 오면 클라이언트 정보를 담아두는 구조체에서 해당 소켓의 내용을 지우고 closesocket을 해버립니다
불필요하다고 생각해서 중복 실행 방지를 해뒀고 코드 가상화를 해둬서 우회를 했을 확률은 매우 낮은데 그럼 클라이언트가 종료돼도 소켓이 남아있다는 소리같은데
원인이 무엇이고 어떻게 해결해야되나요?
참고로 서버단에서는 FD_CLOSE가 오면 클라이언트 정보를 담아두는 구조체에서 해당 소켓의 내용을 지우고 closesocket을 해버립니다
일반적인 경우 서버는 클라이언트의 접속 해제를 인지할 수 없습니다.
ㄴ90%정도는 클라 끌때 FD_CLOSE 와요 클라에서 closesocket해줘서그런가
그건 프로토콜 상으로 read-write 에 물려 있는경우지.
그냥은 몰라. 클라이언트는 인지할 수 있어도.
그럼 우째야하나요? 서버에서 주기적으로 핑 보내서 답없는놈들 끊어야 하는건지
TCP Server Keep Alive 로 검색해 보렴.
감사합니다