C# .NET Socket problème de connexion - une Seule utilisation de chaque adresse de socket est normalement autorisée
Je rencontre le problème suivant:
Une fois que je ferme mon WM6 application, puis essayez de démarrer à nouveau, j'obtiens cette erreur:
Une seule utilisation de chaque adresse de socket (protocole/adresse réseau/port) est habituellement autorisée au Système.Net.Les Sockets.Socket.Bind(point de Terminaison localEP)
au
Système.Net.Les Sockets.Socket.TcpListener.Start()
...
Je pense que cela est dû à l'intervalle de temps pour la connexion de délai d'attente, donc je voudrais fermez toutes les conections et le forcer à créer une nouvelle connexion, est-ce la bonne manière de procéder, ou est-il une autre façon de gérer cela?
Voici le code utilisé pour démarrer l'écoute:
///<summary>
///Listens Asynchronously to Clients, creates a recieveMessageHandler to process the read.
///
///Check WIKI, TODOS
///</summary>
///<returns></returns>
public void Listen()
{
myTcpListener.Start();
while (true)
{
//blocks until a client has connected to the server
try
{
TcpClient myTcpClient = myTcpListener.AcceptTcpClient();
DateTime now = DateTime.Now;
//Test if it's necessary to create a client
ClientConnection client = new ClientConnection(myTcpClient, new byte[myTcpClient.ReceiveBufferSize]);
//Capture the specific client and pass it to the receive handler
client.NetworkStream.BeginRead(client.Data, 0, myTcpClient.ReceiveBufferSize, r => receiveMessageHandler(r, client), null);
}
catch (Exception excp)
{
Debug.WriteLine(excp.ToString());
}
}
}
Je ne, cependant, je suis d'appeler des Dll qui parfois le plantage de l'application et le code d'arrêt n'est pas appelé.
Vous avez besoin pour mieux gérer l'erreur. Par juste un plantage & quitter votre des ressources non managées autour de la pose, vous obtenez cette erreur. Bien que le CLR poignées de gestion de la mémoire pour vous pour les objets gérés, vous devez le faire pour des objets non gérés, tels que les fichiers & réseaux de connexions.
Le problème que j'ai c'est que je n'ai pas de moyen de gérer cette partie de Dll, l'utilisateur peut également bloquer l'application. Je suis ouvert aux suggestions sur la façon de gérer troisième partie se bloque et comment gérer l'utilisateur va dans le gestionnaire des tâches et la fermeture de l'application.
OriginalL'auteur Astronaut | 2013-03-13
Vous devez vous connecter pour publier un commentaire.
Oui, votre serveur de socket est probable dans l'état TIME_WAIT.
Vous pouvez accéder au sous-jacente ServerSocket et ensuite utiliser SetSocketOption et spécifier ReuseAddress.
Ainsi, après la création de la listner je dois faire: myTcpListener.Serveur.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReuseAddress, true);
OriginalL'auteur tcarvin
Je suppose ici que
ClientConnection
est votre DLL, parce que je ne vois que déjà inclus dans le CF.Vous n'avez pas vraiment besoin de ça, mais, si vous déclarez MethodInvoker.
Afin de rendre votre code vraiment nappe, vous devez également créer votre propre EventArgs classe:
Très simple. Avec cette nouvelle WmTcpEventArgs classe et, vous devriez recevoir vos données qui pourraient post à quelque chose comme une Zone de texte de contrôle:
Au lieu de codage d'un
while(true)
dans votre code, je préfère inclure un peu variable BooléenneLe code devrait ressembler à quelque chose comme ceci:
Avis vous êtes toujours à la capture de vos Exceptions, mais vous pouvez aussi arrêter la TcpListener.
OriginalL'auteur jp2code