Por que o soquete lê 0 bytes quando mais estava disponível

Eu descobri que o seguinte código faz loop com 100% de uso da CPU:

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);
    /* ... */
}

A saída é:

Read: 0 Available: 1
Read: 0 Available: 1
Read: 0 Available: 1
Read: 0 Available: 1
Read: 0 Available: 1
...

Eu estava esperando o método socket.Receive ler o byte restante, mas aparentemente não resulta em um loop de código a 100

Como sugerido por jgauffin nodocumentaçã lê:

Se o host remoto encerrar a conexão Socket com o método Shutdown, e todos os dados disponíveis foram recebidos, o método Receive será concluído imediatamente ereturn zero bytes.

Portanto, a leitura 0 é o tipo de esperado, mas somente após a leitura de todos os dados, que soquet

Documentação para Socket.Availableencione apenas uma conexão fechada que gera uma exceçã

Como posso garantir que o último byte seja lido?

Related: ist é uma resposta de como detectar uma conexão fechada que depende do soquete. Disponível como 0 quando não houver mais dados e a conexão estiver fechada,

questionAnswers(1)

yourAnswerToTheQuestion