Я использую методы 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);
}