TCPListener blues, не могу понять, почему соединение не закрывается правильно - PullRequest
1 голос
/ 05 октября 2011

Мой TCPListener настроен так:

this.tcpListener = new TcpListener(IPAddress.Any, config.portNum);

Затем я (используя многопоточность) настраиваю функцию прослушивателя следующим образом:

private void ListenForClients()
    {
       this.tcpListener.Start(); 

       while (true)
       {
         //blocks until a client has connected to the server
         TcpClient client = this.tcpListener.AcceptTcpClient();

         //create a thread to handle communication 
         //with connected client

         ThreadStart starter = delegate { HandleClientComm(client, this.DBGrid); };
         Thread thread = new Thread(starter);
         thread.Start();
        }
     }

Первый раз, когда это работает, второй раз, когда я запускаю это, я получаю это сообщение об ошибке:

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

Внутри ветки есть звонок на закрытие:

tcpClient.Close();

Но, похоже, это не освобождает порт, какие-либо предложения?

Ответы [ 2 ]

2 голосов
/ 05 октября 2011

Проблема с tcpListener.Start (). Вам не разрешено иметь 2 слушателя на одном и том же порту. Метод ListenForClients должен вызываться только один раз в вашем приложении

2 голосов
/ 05 октября 2011

Если вы вызываете ListenForClients несколько раз, это является источником вашей проблемы, а не то, что клиентское соединение не * Close() правильно.

Традиционно, один поток будет обрабатывать открытие основного сокета и принятие 'розетки для подключения детей.Таким образом, ваш ListenForClients должен быть в главном потоке сервера и вызываться только один раз для каждого приложения.

НЕКОТОРЫЕ ДОПОЛНИТЕЛЬНЫЕ ИНФОРМАЦИИ:

this.tcpListener.Start(); 

создает прослушиваемое соединение на указанном вами порту.При каждом подключении клиента линия

TcpClient client = this.tcpListener.AcceptTcpClient();

создаст НОВЫЙ сокет, который подключен и находится на совершенно другом порту.Таким образом, закрывая ваш клиент, вы вообще не освобождаете свой основной сокет.

С http://en.wikipedia.org/wiki/Internet_socket#Socket_states_and_the_client-server_model

Компьютерные процессы, предоставляющие службы приложений, называются серверами и создают сокеты назапустить, которые находятся в состоянии прослушивания.Эти сокеты ждут инициатив от клиентских программ.Для прослушивающего сокета TCP удаленный адрес, представленный netstat, можно обозначить 0.0.0.0, а номер удаленного порта - 0.

Сервер TCP может одновременно обслуживать несколько клиентов, создав дочерний процесс для каждого клиента и установивTCP-соединение между дочерним процессом и клиентом.Уникальные выделенные розетки создаются для каждого соединения.Они находятся в установленном состоянии, когда виртуальное соединение сокет-сокет или виртуальный канал (VC), также известный как сеанс TCP, устанавливается с удаленным сокетом, обеспечивая дуплексный поток байтов.

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