Supongamos que está utilizando TCP. Cuando llamas a send, los datos que estás enviando se colocan inmediatamente en la cola saliente y se envían y luego se completan con éxito. Sin embargo, si el envío no puede colocar los datos en la cola saliente, el envío regresará con un error.
Como Tcp es un protocolo de entrega garantizado, los datos en la cola saliente solo se pueden eliminar una vez que el extremo remoto ha recibido el acuse de recibo. Esto se debe a que los datos pueden ser reenviados si no se recibió ack a tiempo.
Si el extremo remoto es lento, la cola saliente se llenará de datos y el envío se bloqueará hasta que haya espacio para colocar los nuevos datos en la cola saliente.
Sin embargo, la conexión puede fallar de tal forma que no se pueden enviar más datos. Aunque una vez que se ha cerrado una conexión TCP, cualquier envío adicional dará como resultado un error, el usuario no tiene forma de saber cuántos datos realmente llegaron al otro lado. (No conozco ninguna forma de recuperar la contabilidad TCP desde un socket a la aplicación del usuario). Por lo tanto, si se requiere la confirmación de la recepción de datos, probablemente debería implementar esto en el nivel de la aplicación.
Para UDP, creo que no hace falta decir que una forma de informar lo que se ha recibido o no se debe.
¿Cuál es el tipo de protocolo del socket? TCP, UDP, algo más? – torak
Uso el protocolo TCP – Giann