2010-06-07 4 views
4

tcpListener를 통해 통신하는 서비스가 있습니다. 문제는 사용자가 서비스를 다시 시작한 경우입니다. "이미 사용중인 주소"예외가 발생하고 몇 분 정도 서비스를 시작할 수 없습니다.강제로 TcpListener를 닫을 수 있습니까

새 연결을 열 수 있도록 이전 연결을 종료하도록 시스템에 알리는 방법이 있습니까? (서비스가 클라이언트에게 포트인지 알려줄 방법이 없기 때문에 랜덤 포트를 사용할 수 없습니다. 따라서 미리 정의 된 포트에 의존해야합니다.)

답변

3

수신 포트에 바인딩하기 전에 SO_REUSEADDR 소켓 옵션을 설정하십시오 . 해당 .NET 코드는 다음과 유사합니다.

SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, 1); 
+0

감사합니다. 위대한 작품 – Nissim

1

소켓이 닫힌 후 얼마 동안 사용되지 않는 이유가 있습니다. 소켓은 4 개의 튜플, 소스 및 대상 포트, 소스 및 대상 IP로 구성됩니다.

클라이언트가 서버로 데이터를 보내는 중일 때 강제로 소켓을 닫았다고 가정 해 보겠습니다. 5 초를 기다렸다가 동일한 포트를 사용하여 서버를 다시 열고 동일한 클라이언트가 동일한 4 개의 튜플로 데이터를 보내면 서버가 잘못된 TCP 시퀀스 번호가있는 패킷을 가져오고 연결이 재설정됩니다.

당신은 스스로 발을 촬영 : 연결이 그들이 다시 사용할 수있을 때까지 (배포판에 따라 다름) 2-4분의 TIME_WAIT 상태를 왜

이입니다. 그냥 분명히 말하면, 나는 수신 대기 TCP 포트가 아니라 소켓에 대해 이야기하고 있습니다.

관련 문제