uso sqlstate solo socket por permitido permite permisos intento hy000 direcci¾n direcci cada acceso sockets tcp buffer blocking

sockets - sqlstate - ¿Qué sucede cuando escribo datos en un socket de bloqueo, más rápido de lo que lee el otro lado?



solo se permite un uso de cada direcci¾n de socket (2)

El búfer de salida (envío) se llena hasta que se llena y el bloque send() hasta que el búfer se libera lo suficiente como para poner en cola el paquete.

Como dice el manual de la página dice:

Cuando el mensaje no encaja en el búfer de envío del socket, send () normalmente se bloquea, a menos que el socket se haya colocado en modo de E / S sin bloqueo.

Mira esto: http://manpages.ubuntu.com/manpages/lucid/man2/send.2.html

Supongamos que escribo datos muy rápido [tengo todos los datos en la memoria] en un zócalo de bloqueo. además, suponga que el otro lado leerá los datos muy lentamente [como el sueño 1 segundo entre cada lectura].

¿Cuál es el comportamiento esperado en el lado de la escritura en este caso? ¿Bloquearía la operación de escritura hasta que el otro lado lea suficientes datos, o la escritura devolverá un error como el restablecimiento de la conexión?


Para un socket de bloqueo, la llamada send() se bloqueará hasta que todos los datos se hayan copiado en el búfer de la pila de la red para esa conexión. No tiene que ser recibido por el otro lado. El tamaño de este búfer depende de la implementación.

Los datos se borran del búfer cuando el lado remoto lo reconoce. Esto es una cuestión del sistema operativo y no depende de la aplicación remota que realmente lee los datos. El tamaño de este búfer también depende de la implementación.

Cuando el búfer remoto está lleno, le dice a su pila local que deje de enviar. Cuando los datos se borran del búfer remoto (al ser leídos por la aplicación remota), el sistema remoto informará al sistema local para que envíe más datos.

En ambos casos, los sistemas pequeños (como los sistemas integrados) pueden tener búferes de unos pocos KB o más pequeños y los servidores modernos pueden tener búferes de unos pocos MB o más.

Una vez que haya espacio disponible en el búfer local, se copiarán más datos de su llamada send() . Una vez que se hayan copiado todos esos datos, su llamada volverá.

No recibirá un error de "restablecimiento de la conexión" (desde el sistema operativo: las bibliotecas pueden hacer cualquier cosa) a menos que la conexión realmente se restablezca.

Entonces ... Realmente no importa la rapidez con la que la aplicación remota esté leyendo datos hasta que haya enviado tantos datos como el tamaño de los búferes locales y remotos combinados. Después de eso, solo podrás send() tan rápido como el lado remoto recv() .