Duda envio de datos con API socket de cartilla

Duda envio de datos con API socket de cartilla

de Juan Manuel Roquero Bravo -
Número de respuestas: 3

Hola tengo una duda, cual de los siguientes codigos es el correcto para enviar data por un socket?

1)
//socket cliente correctamente inicializado

remain, err = cliente.send(data)

//en esta linea puedo asumir que toda la data se envio

2)
//socket cliente correctamente incializado

remain, err = cliente.send(data)
while(remain != ''){

    remain, err = cliente.send(remain)

}

//en esta linea puedo asumir que toda la data se envio


En respuesta a Juan Manuel Roquero Bravo

Re: Duda envio de datos con API socket de cartilla

de Jorge Visca -

La opción 1) puede funcionar si el socket está en modo bloqueante. La opción 2) es típica de un socket no bloqueante.

La única razón que se me ocurre por la que un socket bloqueante podría tener un remain no vacío es cuando el socket se cierra antes de poder haber enviado todo.


En respuesta a Jorge Visca

Re: Duda envio de datos con API socket de cartilla

de Sergio Leandro Carrasco Sanguinetti -

Si en el examen estamos trabajando con sockets bloqueantes, podemos suponer que se envían todos los datos en el send?

O para estar seguros lo creamos como no bloqueantes y para enviar llamamos a send de esta forma:

String completeSend(socket, data){

  remain = data;

  do {

    remain, err = socket.send(remain);

    if (err!=''){ return err; }

  } while (remain != '')

  return ''; // Se retrona string vacío si se envió todo OK

}

En respuesta a Sergio Leandro Carrasco Sanguinetti

Re: Duda envio de datos con API socket de cartilla

de Jorge Visca -

Una operación bloqueante sobre un socket queda bloqueada hasta completar la tarea, o que surja una condición de error (por ejemplo que el socket sea cerrado por la otra punta).

Tu función completeSend es en realidad una implementación de un send bloqueante implementado sobre send no bloqueantes (muy parecida a la que hay realmente dentro de una biblioteca de sockets)