Frage

Ich habe eine Schleife, die einen Sockel, wirkt auf die Buchse, dann schließt die Buchse und startet erneut öffnet. Doch auf der zweiten Iteration ich SocketException bekommen, nur eine Verwendung einzeln Socketadresse (Protokoll / Netzwerkadresse / Port) ist in der Regel zulässig.
Allerdings ist die Socket geschlossen werden soll, netstat -a nicht zeigen, dass ich auf diesem Port oder irgendetwas hören bin. Der Code, der die Ausnahme auslöst ist:

_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);

Aber ich denke, der Täter nicht, dass Code, kurz bevor ich zu diesem Code erhalten, und bevor ich versuche, die Verbindung bekomme ich diese zu schließen:

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)

Wenn ich das Programm schließen und führen Sie es wieder, es kann die erste Verbindung fein machen, wirkt die zweite nur die gleiche (Socket). Hat jemand eine Idee, wie ich dieses Problem beheben kann?

War es hilfreich?

Lösung

Ich dachte, dass Socket.Close () kümmerte sich um das, aber ich denke nicht. In diesem Fall müssen Sie verwenden:

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

Sie können mehr über die Socket-Optionen lesen hier .

Andere Tipps

Es ist ein bekanntes Problem auf Fenster, dass selbst wenn Sie einen Socket geschlossen haben, gibt einen Waittime ist, bevor die Ressource in die OS freigegeben wird, zurück.

Es gibt eine Möglichkeit, manuell die Waittime für eine Buchse in .NET eingestellt, jedoch kann es eine bessere Option sein, Ihr Design zu überdenken, um stattdessen zu halten die Hörer Buchse offen, anstatt sie zu der Schließung, und schließen Sie stattdessen die neuen Buchse, die während Socket.Accept () erzeugt wird;

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top