2009-03-13 7 views
0

J'ai une boucle qui ouvre une socket, agit sur le socket, puis ferme le socket et redémarre. Toutefois, lors de la deuxième itération, j'obtiens SocketException, Une seule utilisation de chaque adresse de socket (protocole/adresse réseau/port) est normalement autorisée.
Cependant, le socket doit être fermé, netstat -a ne montre pas que j'écoute sur ce port ou quoi que ce soit. Le code qui lève l'exception est:Comment réparer cette 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); 

Cependant, je pense que le coupable n'est pas ce code, juste avant de passer à ce code, et avant que j'essaie de fermer la connexion je reçois ceci:

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)

Une fois que je ferme le programme et l'exécute à nouveau, il peut faire la première connexion bien, le second agit exactement la même chose (SocketException). Quelqu'un at-il une idée de comment je peux résoudre ce problème?

Répondre

5

Je pensais que socket.Close() a pris soin de cela, mais je suppose que non. Dans ce cas, vous devez utiliser:

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

Vous pouvez en savoir plus sur les options de socket here.

+0

cela résout ce problème, mais maintenant je rencontre des problèmes avec mon programme essayant d'accéder à un Socket disposé :( – Malfist

+1

Si vous utilisez socket.close(), je crois que vous devez faire un nouvel objet socket tous ensemble. pour utiliser le même objet, je pense que vous devez utiliser socket.disconnect(). Regardez les documents MSDN - je ne suis pas sûr à 100%, mais je suis à peu près sûr que c'est ce que la déconnexion est faite pour – ryeguy

+0

Je ferme le SSHConnection qui gère la fermeture de la socket, ou est supposé ... – Malfist

1

Il est un problème connu sur Windows, que même si vous avez fermé un socket, il y a un temps d'attente avant que la ressource soit relâchée dans le système d'exploitation. Il est possible de définir manuellement le temps d'attente pour une socket dans .NET, mais il peut être préférable de revoir votre conception, de garder à la place le socket d'écoute, au lieu de le fermer, et de fermer le nouvelle socket créée lors de Socket.Accept();

+0

Si je ne ferme pas le socket, il est fermé à l'autre extrémité et je ne suis pas en contrôle de celui-ci. J'exécute rsync sur le socket qui est une connexion SSH transférée par port (à partir d'un port de machine Windows 873 vers le port machine 873 de rsync). Donc, je ne peux pas changer cela, existe-t-il une solution de contournement? – Malfist

+0

J'ai mis un sommeil de 30 secondes et cela n'a pas aidé. – Malfist

+0

Essayez la solution de Ryeguy avec SetSocketOption. Je n'étais pas au courant qu'une connexion distante pouvait fermer une socket d'écouteur. – Alan