Duda de sockets

Re: Duda de sockets

de Matias Richart -
Número de respuestas: 0

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