Envio de mensajes tcp,

Envio de mensajes tcp,

de Gaston Daniel Barreto Sugliani -
Número de respuestas: 1

La forma convencional de mensajes tcp en el curso es la siguiente:


    Repeat 

        resto, err = destinoSock.send(mensaje)

        if (err)

            return err

        end if 

        mensaje = resto;

    until resto == ""

    return nil


He visto que algunos exámenes mandan directamente algunos mensajes en una sola línea.

resto, err = destinoSock.send("Texto largo")


1) Podemos mandar strings cortos directamente sin necesidad del Repeat until? Por ejemplo, al enviar los strings:

  • "get index.html, dominio:...",
  • "login usuario password ..."
  • "disconnect"

2) Podemos generalizar, (asumiendo socket completamente bloqueante), y enviar cualquier tipo de mensaje en una sola linea?  

_ , err = destinoSock.send(mensaje)


En respuesta a Gaston Daniel Barreto Sugliani

Re: Envio de mensajes tcp,

de Jorge Visca -

Hay soluciones viejas que usan ese patrón, pero son de antes de estandarizar la API del curso (o están equivocadas).
Ahora, el enviar de TCP está alineado al comportamiento real de TCP, por lo que al invocar el send no hay ninguna garantía sobre la cantidad de bytes que van a ser exitosamente cursados. Por lo tanto, asumir que todo el mensaje pasa porque es "corto" se consideran como un error.


El caso de los sockets bloqueantes es más sutil, y probablemente necesite una aclaración en la API. La documentación dice que:

  • el settimeout fija el tiempo disponible para la operación, y que si se pasa un número negativo ese tiempo es infinito
  • el send envía todo lo que puede en el tiempo disponible, pero eso no implica que puede pasar algo de tamaño arbitrario. En una implementación real, el tamaño mñaximo que el send puede pasar por invocación está limitado por el tamaño de buffers internos del SO para TCP, típicamente de algunos KB. O sea que si haces send de un string de 1MB con un socket completamente bloqueante, igualmente va hacer escrituras parciales del tamaño de este buffer.