En mi código de cliente, estoy siguiendo estos pasos para conectarse a una toma de corriente:Reutilizando descriptor de socket en caso de fallo de conexión
Creación de una toma de
sockDesc = socket(PF_INET, SOCK_STREAM, IPPROTO_TCP)
Conectándolo (reintento para 'x "tiempo en caso de fallo)
connect(sockDesc, (sockaddr *) &destAddr, sizeof(destAddr))
(Después de llenar los
destAddr
campos)uso de la toma de
send()
/recv()
operación:send(sockDesc, buffer, bufferLen, 0) recv(sockDesc, buffer, bufferLen, 0)
close()
el descriptor de socket y salidaclose(sockDesc)
Si durante send()
/recv()
se rompe la conexión, me encontré con que Podría conectar volviendo al paso 2.
¿Está bien esta solución? ¿Debo cerrar el descriptor de socket y volver al paso 1?
Otra observación interesante que no puedo entender es cuando detengo mi servidor de eco e inicio el cliente. Creo un Socket (paso 1) y llamo al connect()
que falla (como se esperaba) pero luego sigo llamando al connect()
, digamos, 10 veces. Después de 5 intentos, inicio el servidor y el connect()
es exitoso. Pero durante la llamada send()
recibe SIGPIPE
error. Me gustaría saber:
1) ¿Debo crear un nuevo socket cada vez que connect()
falla? Según mi entender, siempre y cuando no haya realizado ningún send()
/recv()
en el zócalo, es tan bueno como nuevo y puedo reutilizar el mismo fd
para la llamada connect()
.
2) No entiendo por qué se recibe SIGPIPE
cuando el servidor está activo y connect()
tiene éxito.
Después de cambiar el código según lo sugerido cerrando-descriptor scoket y crear un nuevo socket y conectarlo, el problema SIGPIPE ya no está ocurriendo. – Adil
Encontré este enlace útil y relacionado con tu pregunta como el utilizado envía en lugar de escribir: http://stackoverflow.com/questions/9048959/write-and-send-solving-errors-difference –