Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Videotutoriales Sockets #1306

Open
CMauro96 opened this Issue Apr 13, 2019 · 0 comments

Comments

Projects
None yet
1 participant
@CMauro96
Copy link

CMauro96 commented Apr 13, 2019

Prólogo
Este post tiene 2 finalidades:

  • Dar una respuesta general respecto de la problemática que se presenta al seguir los videotutoriales de sockets provistos por la cátedra.
  • Mostrar que el foro también es una de las vías validas que contamos para compartir dudas , con ayudantes y otros estudiantes, tanto del TP como de las herramientas en la cursada.

Buenas!
A raíz de varias consultas que recibimos los ayudantes tanto de forma remota como presencial sobre los problemas para completar satisfactoriamente el tutorial sobre sockets, nos pusimos a revisar dónde se encontraba el inconveniente.

Para ponernos en contexto, algunos alumnos nos reportaron que la problemática se encontraba a la hora de levantar un servidor y empezar a recibir conexiones y mensajes, obteniendo el siguiente mensaje al hacer un recv: Bad File Descriptor.
Al intentarlo y toparme con lo mismo pensé: estaré realizando bien el accept? 🤔

Si vemos el código, la sección en donde aceptamos las conexiones es la siguiente:

struct sockaddr_in direccionCliente;
unsigned int tamanioDireccion;
int cliente = accept(servidor, (void*) &direccionCliente, &tamanioDireccion);

printf("Recibi una conexion %d!!\n", cliente);
send(cliente, "Hola netcat, como estas?\n", 25, 0);

A simple vista el código parece correcto, pero nuestro querido man nos dicen los siguiente en una sección de la especificación de la función accept():

The addrlen argument is a value-result argument: the caller must initialize it to contain the size (in bytes) of the structure pointed to by addr; on return it will contain the actual size of the peer address.

image
Qué nos quiere decir man con esto?

Addrlen es uno de los parámetros que hay que pasarle a la función accept(), más específicamente el tercero (pista: es el que en videotutorial definimos como tamanioDireccion).

Si interpretamos y traducimos lo que cité arriba llegamos a lo siguiente: el parámetro addrlen que recibe la función accept() debe estar inicializado previamente teniendo por valor el tamaño (en bytes) del segundo parámetro o addr. Revisando el segundo parámetro nos encontramos que es la variable direccionCliente que tiene por tipo una estructura de datos.

Entonces, si necesitamos inicializar tamanioDireccion con el tamaño en bytes de una estructura, cómo lo hacemos?... Ya se! Podemos usar sizeof 😎, que nos va a permitir calcular el tamaño en bytes de direccionCliente.

En conclusión, para poder resolver el inconveniente lo que nos faltaba hacer era lo siguiente:
unsigned int tamanioDireccion = sizeof(struct sockaddr_in);
De esta forma el código para poder aceptar conexiones correctamente queda:

struct sockaddr_in direccionCliente;
unsigned int tamanioDireccion = sizeof(struct sockaddr_in);
int cliente = accept(servidor, (void*) &direccionCliente, &tamanioDireccion);

printf("Recibi una conexion %d!!\n", cliente);
send(cliente, "Hola netcat, como estas?\n", 25, 0);

Ahora volvemos a correr el programa y...
image
Eureka! Nuestro servidor ahora puede enviar y recibir mensajes a través de sockets 🎉

Espero este issue les sirva para poder tener su implementación de sockets funcionando y poder progresar en el trabajo práctico.
Nos estaremos viendo.
Saludos,
Mauro

@SofiCortes SofiCortes pinned this issue Apr 14, 2019

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
You can’t perform that action at this time.