2009-07-08 11 views
4

J'ai un service Windows écrit dans un code similaire à ce Asynchronous Server Socket Examplearrêt .Net écouter prise

Tout fonctionne très bien. La communication client/serveur fonctionne parfaitement. Aucun problème du tout. Lorsque je tente d'arrêter le service Windows, je ne peux pas arrêter l'auditeur socket serveur sans obtenir l'erreur suivante:

A request to send or receive data was disallowed because the socket is not connected and (when sending on a datagram socket using a sendto call) no address was supplied.

J'ai essayé toutes les combinaisons de ce qui suit pour arrêter l'écoute. Mais ils jettent tous l'erreur.

listener.Shutdown(SocketShutdown.Both); 
listener.Disconnect(true); 
listener.Close(); 

Même s'il est défectueux, le socket est finalement libéré et arrêté. Cependant, cela peut prendre jusqu'à une minute avant de pouvoir redémarrer mon service Windows. Je dois pouvoir faire fonctionner le service Windows plus rapidement que cela. S'il vous plaît laissez-moi savoir si vous pouvez aider. Merci ...

Répondre

1

Le port d'écoute est le socket que vous utilisez pour .Bind(), .Listen() et .Accept(), c'est à dire que ce n'est pas le socket qui se connecte via .Connect() ou est la connexion acceptée via .Acceptez()?
Ensuite, n'appelez pas listener.Discconnect().

détails "Useless":
System.Net.Socket.Disconnect utilise un pointeur de fonction (à risque) pour appeler le (natif) l'extension winsock fonction DisconnectEx:

 
Parameters
hSocket [in]
A handle to a connected, connection-oriented socket.
Votre socket d'écoute est pas dans un état connecté.

2

Définissez la propriété LingerState

socket.LingerState = new LingerOption(false, 0); 
socket.Shutdown(SocketShutdown.Both); 
socket.Disconnect(false); 
socket.Close(); 

Hope this helps.

+0

Selon msdn, LingerOption.Enabled == false est la valeur par défaut et signifie _do_ s'attarder pour le délai d'attente par défaut. Croyez-vous que la documentation soit erronée? http://msdn.microsoft.com/en-us/library/system.net.sockets.lingeroption.lingeroption.aspx – Aaron

Questions connexes