Duda de sockets

Duda de sockets

de Franco Danilo Wanseele Gonzalez -
Número de respuestas: 1

Hola que tal? Tengo alguna duda con respecto al uso de los sockets, que vi que se hace de forma diferente en algunos exámenes.

- Vi que en algunos exámenes, en lugar de hacer socket.receive() o socket.send() hace socket.readline (o socket.read) o socket.writeln. Según entiendo la API, si uso la API de socket debería siempre hacer receive o send es verdad? Existe algún caso en el que se deba usar read o write con un socket? (tal vez al recibir o enviar comandos del estilo "ERROR \n")

- Relacionado a esto, en algunos casos he visto que los receive se hacen en una iteración do while y otras veces simplemente se hace 

data, err = socket.receive()

El do while puedo entenderlo si se hace en por ejemplo peticiones http donde si se le responde un índex.html sería muy grande para enviarlo en un solo paquete, pero hay algún criterio en especial para decidir por una opción u otra? Perjudica una opción o la otra al momento de la corrección?

- Según entiendo las primitivas, al inicializar un socket udp no se le realiza un bind() (a diferencia de tcp), estoy en lo correcto?

- En el examen de julio 2017, en una parte de la solución inicializa un socket udp de la siguiente manera:

u = socket.udp() 
u:setsockname(‘*’, 1234)
el cual usa para después hacer un receive (lo cual indicaría que escucha en todas las ip y en el puerto 1234, según entiendo). Se puede inicializar un socket udp que escuche en una cierta ip y puerto? Sería similar a las lineas anteriores que se inicializa? 

Muchas de estas preguntas las hago porque, además de tener las dudas, vi en el foro que se debe respetar el uso de la API de socket y entiendo que en soluciones viejas puede no ser del todo correcto el uso de estas.

Muchas gracias!

Saludos.

En respuesta a Franco Danilo Wanseele Gonzalez

Re: Duda de sockets

de Matias Richart -

Estimado.

Debido a estas diferencias que mencionás y a las diferencias entre distintas API de sockets de los distintos lenguajes de programación es que en las últimas ediciones del curso (desde 2018) se diseño una API "del curso".

Antes de eso, las soluciones varían debido a que no había una API única, aunque en general se seguía un estilo similar al de C o Java.

Ahora copio parte de algunas de tus preguntas y te responde entre líneas.

>>Según entiendo la API, si uso la API de socket debería siempre hacer receive o send es verdad?

Si. Debes seguir la API del curso.

>>Existe algún caso en el que se deba usar read o write con un socket? (tal vez al recibir o enviar comandos del estilo "ERROR \n")

No, como decía antes, ahora hay que seguir la API del curso.

Mas en general, en C se puede usar read y write que son las llamadas genéricas para cualquier file descriptor, pero en el caso de sockets no te permitirían usar las opciones específicas de sockets.

>>Relacionado a esto, en algunos casos he visto que los receive se hacen en una iteración do while y otras veces simplemente se hace  ....

Acá hay que diferenciar entre TCP y UDP ya que TCP trabaja con flujo (stream) de bytes mientras que UDP con datagramas (paquetes).

Entonces, en TCP siempre es necesario leer en un loop hasta recibir todos los bytes esperados ya que una sola lectura nos dará los bytes que llegaron hasta ese momento.

En UDP, si los datos esperados estamos seguros que entran en un datagrama, leyendo solo una vez es suficiente para recibir todo el datagrama.

>>Según entiendo las primitivas, al inicializar un socket udp no se le realiza un bind() (a diferencia de tcp), estoy en lo correcto?

De donde se desprende esto? Si se puede (y a veces debe) realizar un bind a un socket UDP.

>>En el examen de julio 2017, en una parte de la solución inicializa un socket udp de la siguiente manera: .... Se puede inicializar un socket udp que escuche en una cierta ip y puerto? Sería similar a las lineas anteriores que se inicializa? 

Si y no. Se puede asignar una IP y puerto local utilizando bind (según la API del curso). Las "líneas anteriores" utilizan una API distinta en donde setsockname es equivalente a bind.


Saludos