Comment puis-je corriger l'erreur "une Seule utilisation de chaque adresse de socket (protocole/adresse réseau/port) est habituellement autorisée"?

J'ai fait beaucoup de googling mais je n'ai pas eu beaucoup de chance avec mes problèmes. Je suis nouveau dans la programmation réseau et j'essaie d'apprendre, j'ai essayé de mettre en place un serveur et un client simples qui communiquent (à la suite d'un tutoriel en ligne situé ici - > http://tech.pro/tutorial/704/csharp-tutorial-simple-threaded-tcp-server )

Le problème que j'ai est que je continue à obtenir l'exception "une seule utilisation de chaque adresse de socket (protocole/adresse réseau/port) est normalement autorisée" en essayant pour démarrer le TcpListener sur le serveur.

J'ai essayé de désactiver mon pare-feu, de changer le port à utiliser, de déplacer des variables mais en vain (le client fonctionne bien, mais il ne peut évidemment pas trouver le serveur car je ne peux pas le lancer).

J'ai vu des solutions décrivant L'utilisation de Socket.Poll() mais puisque je n'utilise que L'objet TcpListener, Je n'ai aucune idée de comment utiliser la fonction Poll.

Mon code:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Net.Sockets;
using System.Net;
using System.Threading;
using System.Text;

namespace ServerTutorial {
class Server {
    private readonly Thread m_listenThread;

    public Server() {
        m_listenThread = new Thread(new ThreadStart(ListenForClients));
        m_listenThread.Start();
    }

    public void ListenForClients() {
        var listener = new TcpListener(IPAddress.Any, 3000);
        listener.Start();

        while (true) {
            //Blocks until a client has connected to the server
            TcpClient client = listener.AcceptTcpClient();

            //Send a message to the client
            var encoder = new ASCIIEncoding();
            NetworkStream clientStream = client.GetStream();
            byte[] buffer = encoder.GetBytes("Hello Client!");
            clientStream.Write(buffer, 0, buffer.Length);
            clientStream.Flush();

            //Create a thread to handle communication with the connected client
            var clientThread = new Thread(new ParameterizedThreadStart(HandleClient));
            clientThread.Start(client);
        }
    }

    private void HandleClient(object clientObj) { //Param thread start can only accept object types, hence the cast
        var client = (TcpClient) clientObj;
        NetworkStream clientStream = client.GetStream();

        var message = new byte[4096];

        while (true) {
            int bytesRead = 0;

            try {
                //Block until a client sends a message
                bytesRead = clientStream.Read(message, 0, 4096);
            } catch {
                //A socket error has occurred
                System.Diagnostics.Debug.WriteLine("A socket error has occured");
                break;
            }

            if (bytesRead == 0) {
                //The client has disconnected from the server
                System.Diagnostics.Debug.WriteLine("A client has disconnected from the server");
                client.Close();
                break;
            }

            //Message has been received
            var encoder = new ASCIIEncoding();
            System.Diagnostics.Debug.WriteLine(encoder.GetString(message, 0, bytesRead));
        }
    }
}
}

Dans ma méthode principale:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;

namespace ServerTutorial {
class Program {
    static void Main(string[] args) {
        var server = new Server();
        server.ListenForClients();
    }
}
}

Tout l'aide est extrêmement appréciée!

33
demandé sur Luke Girvin 2013-02-02 01:03:00

3 réponses

ListenForClients est appelé deux fois (sur deux threads différents) - une fois à partir du constructeur, une fois à partir de l'appel de méthode explicite dans Main. Lorsque deux instances de TcpListener essaient d'écouter sur le même port, vous obtenez cette erreur.

29
répondu Ryan Cavanaugh 2013-02-01 21:06:38

Vous déboguez deux fois ou plus. ainsi, l'application peut fonctionner plus à la fois. Alors seulement ce problème se produira. Vous devez fermer toutes les applications de débogage à l'aide du Gestionnaire des tâches, puis déboguer à nouveau.

11
répondu mansoor 2014-01-16 05:47:27

J'ai rencontré un problème similaire sur windows server 2012 STD 64 bit, mon problème est résolu après la mise à jour de windows avec toutes les mises à jour Windows disponibles.

1
répondu Amit Bhargava 2018-07-16 03:25:24