Qual è la migliore pratica per prevenire l'incidente qui?
O disabilita i sigpipes come per tutti, oppure cattura e ignora l'errore.
C'è un modo per verificare se l'altro lato della riga sta ancora leggendo?
Sì, utilizzare select ().
select () non sembra funzionare qui poiché dice sempre che il socket è scrivibile.
È necessario selezionare i bit letti . Probabilmente puoi ignorare la scrittura bit di .
Quando l'estremità remota chiude l'handle del file, selezionare seleziona per indicare che ci sono dati pronti per la lettura. Quando vai a leggerlo, otterrai 0 byte, che è come il sistema operativo ti dice che l'handle del file è stato chiuso.
L'unica volta che non puoi ignorare i bit di scrittura è se stai inviando grandi volumi e c'è il rischio che l'altra estremità venga backlog, il che può causare il riempimento dei buffer. In tal caso, provare a scrivere nell'handle del file può causare il blocco o il fallimento del programma / thread. Testare la selezione prima di scrivere ti proteggerà da questo, ma non garantisce che l'altra estremità sia integra o che i tuoi dati arriveranno.
Nota che puoi ottenere un sigpipe da close (), così come quando scrivi.
Chiudi elimina tutti i dati bufferizzati. Se l'altra estremità è già stata chiusa, la chiusura fallirà e riceverai un sigpipe.
Se si utilizza il TCPIP bufferizzato, una scrittura corretta significa solo che i dati sono stati messi in coda per l'invio, non significa che siano stati inviati. Fino a quando non si chiude correttamente, non si sa che i dati sono stati inviati.
Sigpipe ti dice che qualcosa è andato storto, non ti dice cosa o cosa dovresti fare al riguardo.