하나의 클라이언트 만 받아 들일 수있는 C#으로 서버를 개발 중이며 다른 클라이언트가 연결 요청을 받아들이려면이 클라이언트의 연결이 끊어졌을 때를 알아야합니다..NET에서 클라이언트 연결 끊김을 검색하는 최선의 방법은 무엇입니까?
나는 지속적으로 연결 요청을 수신하고 Socket.BeginAccept
으로 클라이언트를 수락하거나 거부하는 첫 번째 소켓을 사용하고 있습니다. 클라이언트가 받아 들여지면 Socket.EndAccept
에 의해 반환 된 새로운 소켓은 클라이언트와 서버 사이의 통신에 사용됩니다. 그런 다음 서버는 Socket.Begin/EndReceive
을 사용하여 클라이언트의 명령을 기다리고 응답을 보냅니다. 서버는 텔넷 형 프로토콜을 사용합니다. 즉, 각 명령과 각 응답 행은 \r\n
으로 끝나야합니다.
클라이언트의 연결이 끊어 졌는지 확인하기 위해 빈 메시지 ("\r\n
")를 클라이언트에 500ms마다 보내는 타이머를 설치했습니다. 클라이언트가 단절된 경우 Socket에 의해 예외가 throw됩니다. 이 예외는 현재 세션을 닫고 새 연결을 허용하는 서버에 의해 포착됩니다. 이 솔루션은 강력하지만 네트워크를 통한 불필요한 트래픽을 의미하므로 실제 응답을 얻기 전에 더미 메시지를 필터링해야하는 클라이언트가 올바르게 처리해야합니다.
빈 버퍼 (Socket.Send(new byte[1], 0, 0)
)를 보내려고했지만 서버 -> 클라이언트 방향으로 작동하지 않는 것 같습니다.
또 다른 해결책은 Socket.EndReceive
이 0 바이트를 반환하는 경우를 처리하는 것일 수 있습니다. 그것은 "유휴"시간 동안 발생하는 단절의 경우에 잘 작동합니다. 그러나 메시지 전송 중에 클라이언트의 연결이 끊어지면 서버는 항상 메시지를 보지 않고 무기한 대기합니다.
이 문제에 관해 여러 스레드와 질문을 보았지만 좋은 솔루션을 본 적이 없습니다.
제 질문은 : 닷넷에서 단절을 감지하는 가장 좋은 방법은 무엇입니까?
확인, 내 소켓에 KeepAlive를 사용할 수 있도록 코드를 추가했습니다. 그러나 나는 지금 무엇을 기대하고 있나? 클라이언트가 연결을 끊었을 때 아무 일도 일어나지 않습니다 ... 나는 예외를 어딘가에서받을 것으로 예상됩니다 ... 정기적으로 읽거나 쓸까요? – cedrou
Begin/EndReceive를 사용 했는데도? 그렇다면 BeginReceive는 콜백을 실행해야하며 결과를 얻기 위해 EndReceive를 호출 할 때 예외가 발생해야합니다. 그렇지 않으면 스트림 0 바이트를 읽습니다. –
그래, 지금 예외가 생겼어. 고마워. – cedrou