Почему сокет читает 0 байтов, когда доступно больше - PullRequest
5 голосов
/ 03 мая 2011

Я обнаружил, что следующий код зацикливается при 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, когда данных больше нет и соединение закрыто,

1 Ответ

11 голосов
/ 03 мая 2011

Читали ли вы документацию ?

0 чтение байтов означает, что удаленная конечная точка отключена.

Либо используйте блокирующие сокеты, либо используйте асинхронные методы, такие как BeginReceive().Нет необходимости в Poll в .Net.

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