Прослушивающая розетка - PullRequest
3 голосов
/ 05 мая 2010

У меня возникла странная проблема, я никогда не испытывал это раньше, вот код сервера (в данном случае клиент - это firefox), способ, которым я его создаю:

_Socket = new Socket( AddressFamily.InterNetwork, SocketType.Stream, ProtocolType.Tcp );
_Socket.Bind( new IPEndPoint( Settings.IP, Settings.Port ) );
_Socket.Listen( 1000 );
_Socket.Blocking = false;

способ, которым я принимаю соединение:

while( _IsWorking )
{
    if( listener.Socket.Poll( -1, SelectMode.SelectRead ) )
    {
        Socket clientSocket = listener.Socket.Accept();
        clientSocket.Blocking = false;
        clientSocket.SetSocketOption( SocketOptionLevel.Tcp, SocketOptionName.NoDelay, true );
    }
}

Так что я ожидаю, что он зависнет на слушателе. Сокет. Оплата до тех пор, пока не установится новое соединение, но после первого соединения оно зависает при опросе навсегда. Я пытался опрашивать его постоянно с меньшей задержкой, скажем, 10 микросекунд, тогда он никогда не идет в SelectMode.SelectRead. Я думаю, что это может быть как-то связано с повторным использованием сокета клиента? Может быть, я не выключаю клиентский сокет правильно, и клиент (firefox) решает использовать старый сокет?

Я отключаю клиентский сокет следующим образом:

Context.Socket.Shutdown( SocketShutdown.Both ); // context is just a wrapper around socket
Context.Socket.Close();

Что может вызвать эту проблему?

1 Ответ

1 голос
/ 05 мая 2010

Рассматривали ли вы прием удаленных клиентов асинхронно?Я недавно ответил на аналогичный вопрос на TCPListener, но тот же шаблон можно использовать для класса Socket.

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

listener.Socket.Poll( -1, SelectMode.SelectRead ) )

Я заглянул в метод Sockets.TCPListener.Pending(), используя отражатель .NET, и у них есть это вместо этого, может быть, вы можете попробовать это:имейте в виду, что в соответствии с MSDN метод TCPListener.Pending () неблокирует, поэтому не уверен, поможет ли он вам на 100%?

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