Я использую метод BeginReceive() и EndReceive() для async IO с использованием Sockets в .NET. Клиент отправляет непрерывные пакеты данных, а вызов EndReceive() возвращает количество прочитанных байтов.Как избежать блокировки Socket.EndReceive(), когда нет данных
Проблема в том, что клиент отправляет пакеты данных, а длина данных - ZERO. Он нашел это, проанализировав трафик в WireShark. Когда длина данных равна нулю, вызов EndReceive() просто блокируется.
Есть ли способ идентифицировать данные длины ZERO без фактического блокирования на EndReceive()?
Кроме того, свойство ReceiveTimeout не работает на методы Async.
Пример исходного кода:
// 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);
}
Я думаю, что Азиз ответил на ваш вопрос? Даже если клиент отправляет данные нулевой длины, EndRecieve должен запускаться и заканчиваться. Если клиент закрывает сокет до того, как он завершит отправку, EndRecieve должен выбросить исключение, когда ошибки сокета выходят из строя. Я думаю, что здесь происходит что-то еще ... Я думаю, что его блокирование, потому что клиент никогда не отправляет. Вы уверены, что клиент отправляет в тот же сокет, который ждет? – Jess
Даже если клиент завершает отправку нулевых данных, он должен по-прежнему отправлять заголовок сообщения, а затем EndRecieve должен выбрать это и вернуть 0 байт. – Jess
У вас есть контроль над кодом клиента? Можете ли вы поймать случай, когда данные являются нулевыми, и просто не отправлять его? Это может решить вашу проблему, но я снова думаю, что происходит что-то еще. – Jess