Я обнаружил, что следующий код зацикливается при 100% загрузке ЦП:
byte[] buffer = new byte[0x10000];
while (true) {
if (socket.Poll (5000000, SelectMode.SelectRead) == false)
continue;
int available = socket.Available;
if (available == 0)
return;
int read = socket.Receive (buffer);
Console.WriteLine ("Read: " + read + " Available: " + available);
/* ... */
}
Вывод:
Read: 0 Available: 1
Read: 0 Available: 1
Read: 0 Available: 1
Read: 0 Available: 1
Read: 0 Available: 1
...
Я ожидал, что метод socket.Receive прочитает оставшиесябайт, но это, по-видимому, не приводит к тому, что мой код зацикливается на 100%.
Как подсказывает jgauffin, документация гласит:
Если удаленный хост выключаетсяотключите соединение Socket методом Shutdown, и все доступные данные были получены , метод приема завершится немедленно и вернет ноль байт.
Итакчтение 0 является ожидаемым, но только после того, как все данные прочитаны, для данного сокета. Утверждения о недоступности - нет.
Документация для Socket.Available указывает только на закрытое соединение, вызывающее исключение.
Как я могу убедиться, что последний байт прочитан?
Related: this - это ответ о том, как обнаружить закрытое соединение, зависящее отрозетка. Доступно0, когда данных больше нет и соединение закрыто,