2009-03-13 4 views
0

나는 소켓을 열고, 소켓에서 작동 한 다음 소켓을 닫고 다시 시작하는 루프를 가지고있다. 그러나 두 번째 반복에서 나는 SocketException을 얻습니다. 각 소켓 주소 (프로토콜/네트워크 주소/포트)의 한 가지 용도 만 일반적으로 허용됩니다.
그러나 소켓이 닫혀 있어야합니다. netstat -a은 내가 해당 포트 또는 다른 포트에서 수신 대기 중이라는 것을 표시하지 않습니다. 예외를 발생 코드는 다음과 같습니다이 SocketException을 고치는 방법

_bindedLocalSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp); 
_bindedLocalSocket.Bind(new IPEndPoint(Util.ChannelProfileToListeningAddress(_profile), _profile.ListenPort)); 
_bindedLocalSocket.Listen(30); 
_bindedLocalSocket.BeginAccept(new AsyncCallback(OnRequested), null); 

그러나, 나는 범인이 내가 그 코드에 도착하기 직전에, 그 코드가 아닙니다 생각하고, 내가 연결을 종료하기 전에 나는이 얻을 :

An existing connection was forcibly closed by the remote host 
    at System.Net.Sockets.Socket.EndReceive(IAsyncResult asyncResult) 
    at Poderosa.PortForwarding.SynchronizedSocket.EndReceive(IAsyncResult ar) 
    at Poderosa.PortForwarding.Channel.OnSocketData(IAsyncResult result)

일단 프로그램을 닫고 다시 실행하면 첫 번째 연결을 올바르게 만들 수 있고 두 번째 연결은 똑같이 작동합니다 (SocketException). 아무에게도이 문제를 어떻게 해결할 수 있을지 전혀 모르겠습니까?

답변

5

나는 socket.Close()가 그것을 처리했다고 생각했지만, 그렇지 않다고 생각합니다.

socket.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true); 

당신은 소켓 옵션 here에 대한 자세한 내용을보실 수 있습니다 :이 경우에는 사용할 필요가있다.

+0

이 문제가 해결되었지만 폐기 된 소켓에 액세스하려는 프로그램에 문제가 생겼습니다. ( – Malfist

+1

socket.close()를 사용하는 경우 새 소켓 객체를 모두 만들어야한다고 생각합니다. 같은 개체를 사용하려면 socket.disconnect()를 사용해야한다고 생각합니다. MSDN 문서를 살펴보십시오. 100 % 확신 할 수는 없지만 연결 끊김이 무엇인지 확실합니다. – ryeguy

+0

닫힙니다 소켓 닫기를 처리하는 SSHConnection 또는 – Malfist

1

Windows에서 알려진 문제입니다. 소켓을 닫은 경우에도 리소스가 OS로 다시 릴리스되기 전에 대기 시간이 있습니다.

.NET에서 소켓의 대기 시간을 수동으로 설정하는 방법이 있지만 디자인을 다시 방문하고 리스너 소켓을 닫지 않고 열어 놓고 대신 닫는 것이 좋습니다. Socket.Accept() 중에 작성된 새로운 소켓.

+0

소켓을 닫지 않으면 다른 쪽 끝에서 닫히고 제어 할 수 없습니다. 나는 rsync를 포트를 통해 SSH 연결 (Windows 머신 포트 873에서 rsync 머신 포트 873으로) 포트를 통해 실행 중이다. 그래서 나는 그것을 바꿀 수 없다. – Malfist

+0

나는 30 초간 잠을 자면 도움이되지 않습니다. – Malfist

+0

SetSocketOption으로 Ryeguy의 솔루션을 사용해보십시오. 원격 연결로 인해 수신기 소켓을 닫을 수 있다는 사실을 알지 못했습니다. – Alan