Quando um envio sem bloqueio () apenas transfere dados parciais, podemos assumir que retornaria EWOULDBLOCK na próxima chamada?

Dois casos estão bem documentados nas páginas man para sockets não-bloqueantes:

Se send () retorna o mesmo tamanho que o buffer de transferência,a transferência inteira terminado com sucesso, e o soquete pode ou não estar em um estado de retornar EAGAIN / EWOULDBLOCK a próxima chamada com> 0 bytes para transferir.Se send () retorna -1 e errno é EAGAIN / EWOULDBLOCK,nenhuma das transferências terminado, e o programa precisa esperar até que o socket esteja pronto para mais dados (EPOLLOUT no caso epoll).

O que não está documentado para soquetes sem bloqueio é:

Se send () retorna um valor positivo menor que o tamanho do buffer.

É seguro assumir que o send () retornaria EAGAIN / EWOULDBLOCK em mais um byte de dados? Ou deveria um programa sem bloqueio tentar enviar () mais uma vez para obter um EAGAIN / EWOULDBLOCK conclusivo? Estou preocupado em colocar um observador EPOLLOUT no soquete se ele não estiver em um estado "bloquear" para responder a ele.

Obviamente, a última estratégia (tentar novamente obter algo conclusivo) tem um comportamento bem definido, mas é mais detalhada e afeta o desempenho.

questionAnswers(2)

yourAnswerToTheQuestion