¿Cuál es la mejor práctica para evitar el accidente aquí?
O deshabilite los sigpipes según todos, o atrape e ignore el error.
¿Hay alguna manera de verificar si el otro lado de la línea todavía está leyendo?
Sí, use select ().
select () no parece funcionar aquí, ya que siempre dice que el socket es grabable.
Debe seleccionar en los bits de lectura . Probablemente pueda ignorar los bits de escritura .
Cuando el extremo lejano cierra su identificador de archivo, select le indicará que hay datos listos para leer. Cuando vaya y lea eso, obtendrá 0 bytes, que es cómo el sistema operativo le dice que el identificador de archivo se ha cerrado.
El único momento en que no puede ignorar los bits de escritura es si está enviando grandes volúmenes, y existe el riesgo de que el otro extremo se acumule, lo que puede hacer que se llenen sus memorias intermedias. Si eso sucede, intentar escribir en el identificador del archivo puede hacer que su programa / hilo se bloquee o falle. Probar select antes de escribir lo protegerá de eso, pero no garantiza que el otro extremo esté sano o que sus datos lleguen.
Tenga en cuenta que puede obtener un sigpipe de close (), así como cuando escribe.
Cerrar elimina todos los datos almacenados en el búfer. Si el otro extremo ya se ha cerrado, entonces cerrará fallará y recibirá un letrero.
Si está utilizando TCPIP almacenado, entonces una escritura exitosa solo significa que sus datos se han puesto en cola para enviar, no significa que se hayan enviado. Hasta que cierre correctamente, no sabe que sus datos han sido enviados.
Sigpipe te dice que algo salió mal, no te dice qué o qué debes hacer al respecto.