sol_socket sockets network-programming setsockopt

sockets - sol_socket - setsockopt python



¿Cómo es posible tener tiempo de espera de envío en un socket que no bloquea? (2)

SO_SNDTIMEO es útil para un socket de bloqueo. Si el búfer del zócalo está lleno, send () puede bloquear, en cuyo caso puede ser útil utilizar la opción de socket SO_SNDTIMEO. Para los zócalos sin bloqueo, si el búfer del zócalo está lleno, el envío fallará inmediatamente, por lo que no tiene sentido establecer SO_SNDTIMEO con un zócalo no bloqueante.

Tengo algunos problemas para entender el funcionamiento de los sockets en Linux.

setsockopt(sockfd, SOL_SOCKET, SO_SNDTIMEO, &timeout, sizeof(int)); write = write(sockfd, buf, len);

En el código anterior, dado que las escrituras se almacenan en búfer, el tiempo de espera de envío no tiene ningún sentido (la llamada al sistema de escritura regresará inmediatamente cuando el búfer de espacio del usuario se copie en los búferes del kernel). Enviar el tamaño del búfer es un parámetro mucho más importante, pero el tiempo de espera del envío parece no hacer nada que valga la pena. Pero ciertamente estoy equivocado, ya que he visto bastantes códigos que usan SO_SNDTIMEO. ¿Cómo puede el tiempo de espera del código de espacio de usuario usar SO_SNDTIMEO suponiendo que el receptor es muy lento?


¿Cómo es posible tener tiempo de espera de envío en un socket que no bloquea?

No lo es Los tiempos de espera son para el modo de bloqueo. Un recv() no bloqueante no se bloqueará y, por lo tanto, tampoco puede temporizarse.

He visto un montón de código que usa SO_SNDTIMEO.

No en modo sin bloqueo a menos que el código en cuestión no tenga sentido.