2012-01-31 2 views
0

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

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. 

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

Кто-нибудь может предложить способ улучшить код, чтобы принять запрос на любом порту.

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

+0

Зачем вам нужны клиенты для отправки запросов в разные порты ?! Это не разумное требование. –

+0

Чтобы идентифицировать клиента – Madhusmita

+0

Просто отправьте его идентификатор клиенту. Вместо того, чтобы подключиться к порту 8030, попросите его отправить «8030» через сокет. Вы делаете это излишне сложно. –

ответ

4

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

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

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

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

Update:

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

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), чтобы избежать блокировки.

+0

Если я ошибаюсь, вещание означает отправку данных нескольким получателям. Но мне нужно получать данные из нескольких источников. Поэтому, я полагаю, мне не нужна трансляция. – Madhusmita

+0

Вот почему один и тот же слуховой сокет может принимать несколько клиентов. Да, мы можем это сделать. Можете ли вы предложить мне способ идентифицировать запрос отправки клиента на тот же порт на сервер? – Madhusmita

+0

@Madhusmita Если у клиента есть какой-то идентификатор, который должен знать сервер, просто попросите клиента отправить этот идентификатор на сервер. В этом весь смысл подключения - так что клиент и сервер могут обмениваться данными. –