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,