Как избежать блокировки Socket.EndReceive () при отсутствии данных - PullRequest
0 голосов
/ 21 апреля 2009

Я использую методы BeginReceive () и EndReceive () для асинхронного ввода-вывода с использованием сокетов в .NET. Клиент отправляет непрерывные пакеты данных, а вызов EndReceive () возвращает количество прочитанных байтов.

Проблема в том, что клиент отправляет пакеты данных, но длина данных равна нулю. Обнаружил это, проанализировав трафик в WireShark. Когда длина данных равна нулю, вызов EndReceive () просто блокируется там.

Есть ли способ идентифицировать данные длины ZERO без фактической блокировки EndReceive ()?

Кроме того, свойство ReceiveTimeout не работает в асинхронных методах.

Пример исходного кода:

// This method runs on a separate thread
private void ProcessRequest()
{
   BeginReceive(OnClientReceive);

   // Do some work here in a loop
}

// Callback method
private void OnClientReceive(IAsyncResult result)
{
   int receivedCount = socket.EndReceive(result); // this one blocks

   // Do some work here

   // Again start listening for data
   BeginReceive(OnClientReceive);
}

Ответы [ 2 ]

1 голос
/ 26 ноября 2009

Я бы проверил socket.Available

  1. if socket.Available > 0 обработка всего кода в вашем обратном вызове "OnClientReceive"
  2. if socket.Available = 0 должна обрабатываться только часть "// Здесь есть работа"
  3. поставить несколько замков, чтобы избежать конфликтов
0 голосов
/ 21 апреля 2009

Сокеты в .NET работают с пакетами как с непрерывным потоком данных, а не по пакетам. Вот почему EndReceive будет блокироваться до тех пор, пока данные не станут доступны или пока соединение не будет завершено.

Если вы хотите захватывать полученные данные в пакетном режиме, я думаю, вам нужно использовать что-то вроде WinPcap library

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