Как исправить ошибку "обычно разрешено только одно использование каждого адреса сокета (протокол/сетевой адрес/порт)"?

Я сделал много googling, но не очень повезло с моими проблемами. Я новичок в сетевом программировании и пытаюсь учиться, я попытался настроить простой сервер и клиент, которые общаются (после онлайн-учебника, расположенного здесь -> http://tech.pro/tutorial/704/csharp-tutorial-simple-threaded-tcp-server)

проблема в том, что я продолжаю получать исключение "только одно использование каждого адреса сокета (протокол/сетевой адрес/порт) обычно разрешено " при попытке запустить TcpListener на сервере.

Я попытался отключить брандмауэр, изменить используемый порт, перемещать переменные, но безрезультатно (клиент работает нормально, но он, очевидно, не может найти сервер, потому что я не могу его запустить).

Я видел решения, описывающие использование сокета.Poll () но поскольку я использую только объект TcpListener, я понятия не имею, как использовать функцию Poll.

мой код:

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));
        }
    }
}
}

в моем основном методе:

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();
    }
}
}

любая помощь очень ценится!

3 ответов


ListenForClients вызывается дважды (в двух разных потоках) - один раз из конструктора, один раз из явного вызова метода в Main. Когда два экземпляра TcpListener попробуйте прослушать тот же порт, вы получите эту ошибку.


вы отлаживаете два или более раз. таким образом, приложение может работать больше за один раз. Тогда возникнет только эта проблема. Вы должны закрыть все отладочные приложения с помощью Диспетчера задач, а затем снова отладить.


Я столкнулся с аналогичной проблемой на Windows server 2012 STD 64 бит, моя проблема решена после обновления windows со всеми доступными обновлениями windows.