TcpClient 및 TcpListener를 사용하여 네트워크를 통해 통신하는 응용 프로그램이 있습니다. 그러나 클라이언트에서 TcpClient.Close를 호출하여 서버와의 연결을 끊으면 서버가 전혀 반응하지 않습니다.TcpClient.Close가 연결을 닫지 않습니다.
이제이 질문에 대한 답변을 this의 사본으로 작성하고 해결 방법을 here으로 찾을 수 있습니다. 이미 내가 이것을 찾았고 시도해 보았습니다. 도움이되지 않습니다. 또한 TcpClient.Close
, TcpClient.GetStream().Close()
및 TcpClient.Dispose
의 조합을 시도해 보았습니다. 아무것도 작동하지 않습니다.
코드는 아무 것도 주목할 가치가 없습니다. 모든 변수를 다시 설정하고 모든 네트워크 리소스를 닫는 클라이언트의 Disconnect 메서드입니다. 서버에는 TcpClient.Connected
이 true인지 아닌지를 확인하는 루프가 있고, 틀린 경우 루프에서 빠져 나와 스레드를 종료해야합니다.
아이디어가 있으십니까?
정말 고마워요! 내가해야 할 일은 서버에 단절 메시지를 보내는 것뿐이었습니다. 방법을 호출하고 소켓을 자체적으로 이해하는 것으로 할 수 있다고 생각했지만 삶은 그렇게 쉽지 않습니다. – Bevin
@Bevin, 서버가 연결 해제 메시지를 보내지 않는 연결 해제도 처리하는지 확인하십시오. –
실제로 TCP 연결에 대해 서버가 닫히고 있음을 알리는 내용이 서버에 전송되지 않는다는 진술이 사실입니다. TCP 연결이 정상적으로 종료되면 연결 종료를 시작하려는 측은 FIN 플래그가 설정된 메시지를 보냅니다. 불행히도, NetworkStream 또는 TcpClient 클래스는 기본 소켓 API가 수행하더라도이 문제가 발생했음을 감지하는 방법이 없습니다. 실제로 Chris의 대답은 문제의 올바른 해결책입니다. – reirab