web-dev-qa-db-fra.com

Comment corriger l'erreur "Une seule utilisation de chaque adresse de socket (protocole / adresse réseau / port) est normalement autorisée"?

J'ai fait beaucoup de recherches sur Google 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 configurer un serveur et un client simples qui communiquent (en suivant 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 à recevoir l'exception "Une seule utilisation de chaque adresse de socket (protocole/adresse réseau/port) est normalement autorisée" lors de la tentative de démarrage de 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 comme je n'utilise que l'objet TcpListener, je ne sais pas 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();
    }
}
}

Toute aide est extrêmement appréciée!

38
Stephen Foster

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

32
Ryan Cavanaugh

Vous déboguez deux fois ou plus. de sorte que l'application peut s'exécuter plus à la fois. Alors seulement ce problème se produira. Vous devez fermer toutes les applications de débogage à l'aide de task-manager, puis déboguer à nouveau.

14
mansoor

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

1
Amit Bhargava