Qual é a melhor prática para evitar a falha aqui?
Desative o sigpipes de acordo com todos ou capture e ignore o erro.
Existe uma maneira de verificar se o outro lado da linha ainda está lendo?
Sim, use select ().
select () parece não funcionar aqui, pois sempre diz que o soquete é gravável.
Você precisa selecionar os bits de leitura . Você provavelmente pode ignorar os bits de gravação .
Quando a extremidade remota fecha seu identificador de arquivo, selecione informará que existem dados prontos para leitura. Ao ler isso, você receberá 0 bytes, e é assim que o sistema operacional informa que o identificador do arquivo foi fechado.
O único momento em que você não pode ignorar os bits de gravação é se estiver enviando grandes volumes, e existe o risco de a outra extremidade ficar acumulada, o que pode fazer com que seus buffers sejam preenchidos. Se isso acontecer, tentar gravar no identificador de arquivo pode causar um bloqueio ou falha no seu programa / thread. O teste de seleção antes da gravação o protegerá disso, mas não garante que o outro lado esteja íntegro ou que seus dados cheguem.
Observe que você pode obter um sigpipe em close (), assim como quando você escreve.
Fechar libera todos os dados em buffer. Se a outra extremidade já estiver fechada, o fechamento falhará e você receberá um sinal.
Se você estiver usando TCPIP em buffer, uma gravação bem-sucedida significa que seus dados foram colocados na fila para envio, não significa que foram enviados. Até você fechar com êxito, você não sabe que seus dados foram enviados.
Sigpipe diz que algo deu errado, não diz o que ou o que você deve fazer sobre isso.