Comment faire pour “délier” un socket par programmation?
1) Le support ne semble pas supprimer la liaison de l'LocalEndPoint jusqu'à ce que le processus se termine.
2) j'ai essayé les solutions de la question, et j'ai aussi essayé d'attente d'une minute, en vain.
3) pour le moment j'ai essayé de le ci-dessous pour se débarrasser de la douille et de ses connexions:
public static void killUser(User victim)
{
LingerOption lo = new LingerOption(false, 0);
victim.connectedSocket.SetSocketOption(SocketOptionLevel.Socket,SocketOptionName.Linger, lo);
victim.connectedSocket.Shutdown(SocketShutdown.Both);
victim.connectedSocket.Disconnect(true);
victim.connectedSocket.Close();
clients.RemoveAt(victim.ID);
}
4) Après un peu de recherche sur google, je n'arrive pas à être en mesure de séparer un port, donc si j'ai une quantité suffisante de connecter des clients, je vais finir par manquer de ports à écouter.
Ce qui est "à la question"?
OriginalL'auteur ryan1894 | 2011-01-07
Vous devez vous connecter pour publier un commentaire.
Je soupçonne que vous confondez les sockets de vos clients connectés à votre serveur de socket.
Votre serveur de socket est celui qui écoute les connexions entrantes sur un port spécifique. La prise de près dans cette fonction est votre pipe à un des (éventuellement plusieurs) des connexions à distance.
À "délier le port", vous aurez envie de Fermeture/fermeture de la serveur socket.
Mise à jour pour effacer une certaine confusion
Vous devriez avoir un "serveur" socket que vous faites un appel .Bind(point de Terminaison), suivi par un appel à l' .Listen(). C'est le support que vous voulez à l'Arrêt ou à Proximité de "délier", et de libérer un port pour plus tard.
Vous avez alors plusieurs "client" sockets que vous obtenez des références à chaque fois que votre "serveur" socket accepte une nouvelle connexion. Ceux-ci peuvent tous être liés à la même port sans problème. Pour fermer un de ces connexions et déconnexion de votre client, de faire ce que vous faites maintenant. Vous pouvez réellement garniture de la méthode:
De le déconnecter et le reste sont inutiles.
Votre "une socket d'écoute pour les clients potentiels" avait un appel à l' .Bind() à un certain point, à droite? Lorsque vous avez spécifié un point de Terminaison (qui devrait avoir un port qui lui est associé)? Ce port est le port unique de vos clients doivent se connecter (et vous pouvez avoir de nombreux sockets client connecté sur ce port unique). Ce que vous pas démarrer deuxième serveur socket à l'écoute pour les connexions sur le même point de Terminaison jusqu'à ce que vous déliez votre premier serveur (en clôture de cette première prise).
Oh, attendez une minute, je viens de lire votre édition. Lorsqu'un client se connecte sur 5900, pourquoi êtes-vous de les reconnecter à 5901? C'est inutile, il suffit de garder sur 5900.
Hmm, j'ai relu mon code et la ligne qui est à l'origine de ce crash est tempSock.Bind(IPEP); c'est parce que je suis désireux de réutiliser un port. Je me demandais si il est possible de réutiliser un port qui doit l'être (je suppose)... "C'est inutile, il suffit de garder sur 5900" je veux garder 5900 comme un port pour se connecter initialement à: et le reste des ports à utiliser pour le transfert des données... Si je n'ai pas réaffecter les ports à tous les clients les clients doivent vérifier manuellement les ports qui sont en cours d'utilisation ou non etc.
Vous ne devriez jamais appeler Bind une fois, et qui doit être appelée que par votre serveur de socket (celui que vous utilisez pour appeler l'Écouter). Une fois que vos clients (autant que vous voulez) se connecter sur 5900, il n'y a pas besoin de se reconnecter entre eux n'importe où. Vous pouvez avoir tous sur 5900 à la fois. Si vous voulez vous reconnecter, vous devez créer d'autres sockets serveur Écoute sur les autres ports.
OriginalL'auteur Sapph