Ошибка сокета TCP 10061 - PullRequest
       9

Ошибка сокета TCP 10061

0 голосов
/ 31 января 2012

Я создал программу сокета службы Windows, чтобы подключиться к определенному порту и принять запрос клиента. Работает нормально.

protected override void OnStart(string[] args)
    {

      //Lisetns only on port 8030          
       IPEndPoint ipEndPoint = new IPEndPoint(IPAddress.Any, 8030);

      //Defines the kind of socket we want :TCP
       Socket  serverSocket = new Socket(AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp);

        //Bind the socket to the local end point(associate the socket to localendpoint)
            serverSocket.Bind(ipEndPoint);

            //listen for incoming connection attempt
            // Start listening, only allow 10 connection to queue at the same time
            serverSocket.Listen(10);

           Socket handler = serverSocket.Accept();

    }

Но мне нужна служебная программа для прослушивания нескольких портов и принятия запроса клиента на любом доступном порту.

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

Но тогда я получил ошибку 10061

No connection could be made because the target machine actively refused it.

Я не могу знать, в чем причина этой ошибки.

Может ли кто-нибудь предложить способ усовершенствования кода для принятия запроса на любом порту.

Но клиенту необходимо отправить запрос на подключение к определенному порту. например, client1 должен подключиться к port 8030, client2 должен подключиться к port 8031.

1 Ответ

4 голосов
/ 31 января 2012

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

Неправильно. 0 означает, что ОС должна назначить порт. Сервер может прослушивать только один порт за раз. Сокет прослушивания только принимает новые соединения.

Новое соединение будет иметь тот же локальный порт, но комбинация источника (ip / port) и назначения (ip / port) в заголовке IP используется для идентификации соединение . Вот почему один и тот же сокет прослушивания может принимать несколько клиентов.

UDP получил поддержку трансляций, если это то, что вы ищете.

Обновление:

Очень упрощенный пример

  Socket client1 = serverSocket.Accept(); // blocks until one connects
  Socket client2 = serverSocket.Accept(); // same here

  var buffer = Encoding.ASCII.GetBytes("HEllo world!");
  client1.Send(buffer, 0, buffer.Count); //sending to client 1
  client2.Send(buffer, 0, buffer.Count); //sending to client 2

Просто продолжайте звонить Accept для каждого клиента, которого вы хотите принять. Я обычно использую асинхронные методы (Begin / EndXXX), чтобы избежать блокировки.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...