elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado:


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación C/C++ (Moderadores: Eternal Idol, Littlehorse, K-YreX)
| | |-+  ¿ Me pueden explicar este código ? (Sockets)
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] Ir Abajo Respuesta Imprimir
Autor Tema: ¿ Me pueden explicar este código ? (Sockets)  (Leído 2,433 veces)
snake_linux

Desconectado Desconectado

Mensajes: 70


Ver Perfil
¿ Me pueden explicar este código ? (Sockets)
« en: 2 Septiembre 2015, 12:11 pm »

Hola a tod@s, ahora me ha dado por intentar aprender sockets en C, y en si mismo no es muy complicado pero hay unas cuantas lineas que me dan hasta miedo jeje, pongo el código que estoy leyendo:

Código
  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <string.h>
  4. #include <strings.h>
  5. #include <unistd.h>
  6. #include <pthread.h>
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #include <arpa/inet.h>
  10.  
  11. #define PORT 1024
  12. #define BACKLOG 2
  13.  
  14. void* do_some_thing(void*);
  15.  
  16. int main()
  17. {
  18.   int fd;
  19.   struct sockaddr_in server;
  20.  
  21.   pthread_t thread1;
  22.  
  23.   /* Limpiamos la pantalla */
  24.   system("clear");
  25.  
  26.   /* Creamos el socket */
  27.   if ((fd=socket(AF_INET, SOCK_STREAM, 0)) == -1)
  28.   {
  29.      printf("\t*error en la creacion del socket\n");
  30.      return -1;
  31.   }
  32.   server.sin_family = AF_INET;
  33.   server.sin_port = htons(PORT);
  34.   server.sin_addr.s_addr = INADDR_ANY;
  35.   bzero(&(server.sin_zero), 8);
  36.  
  37.   if(bind(fd, (struct sockaddr*) &server, sizeof(struct sockaddr)) == -1)
  38.   {
  39.      printf("\t*error en el BIND\n");
  40.           return -1;
  41.   }
  42.   /* Ponemos el socket a la escucha */
  43.   if(listen(fd, BACKLOG) == -1)
  44.   {
  45.      printf("\t*error en el LISTEN\n");
  46.           return -1;
  47.   }
  48.   if(pthread_create( &thread1, NULL, do_some_thing, &fd) != 0)
  49.   {
  50.      printf("\t*error en pthread_create\n");
  51.      return -1;
  52.   }
  53.   if(pthread_join( thread1, NULL) != 0)
  54.   {
  55.      printf("\t*error en pthread_join\n");
  56.      return -1;
  57.   }
  58.   printf("***SERVER DONE***\n");
  59.   return 0;
  60. }
  61.  
  62. void* do_some_thing(void* fd)
  63. {
  64.   int fd2;
  65.   struct sockaddr_in client;
  66.   socklen_t sin_size;
  67.   char Buffer[100];
  68.  
  69.   sin_size = sizeof(struct sockaddr_in);
  70.  
  71.   fd2 = accept(*((int*)fd), (struct sockaddr*)&client, &sin_size);
  72.   printf("***SERVER START***\n");
  73.   while (sin_size != 0)
  74.   {
  75.      sin_size= recv(fd2, Buffer, 100,0);
  76.      if (sin_size > 0)
  77.      {
  78.         Buffer[sin_size-1]='\0';
  79.         printf("Cadena Recibida: %s\n", Buffer);
  80.  
  81.         if(!strcmp(Buffer, "salir")) sin_size= 0;
  82.      }
  83.   }
  84.   if(close(fd2) != 0)
  85.   {
  86.      printf("\t*error en close thread\n");
  87.      return (void*)-1;
  88.   }
  89.   fd2 = 0;
  90.   printf("GOOD BYE\n");
  91.   return NULL;
  92. }

Con lo que no me aclaro es con las lineas 37 y 71, se perfectamente lo que hacen esas funciones, con lo que me hago un lio es con tanto puntero usándose al mismo tiempo, que ya no se ni cual es el "resultado" de tanto * y & y tanto paréntesis, si alguien me lo explicara detalladamente se lo agradecería un montón.

Y ya de paso, ¿ Hay alguna manera más sencilla de usar sockets en C? (para linux).

Gracias.


« Última modificación: 3 Septiembre 2015, 12:22 pm por snake_linux » En línea

ivancea96


Desconectado Desconectado

Mensajes: 3.412


ASMático


Ver Perfil WWW
Re: ¿ Me pueden explicar este código ? (Sockets)
« Respuesta #1 en: 2 Septiembre 2015, 14:27 pm »

Código
  1. (struct sockaddr*) &server

Le pasa un puntero a la estructura.

Código
  1. *((int*)fd)
fd es void*, así que primero hace un cast a int*. Luego, accede al valor con la desreferencia (*).

Código
  1. &sin_size

Le pasa un puntero a sin_size.


En línea

snake_linux

Desconectado Desconectado

Mensajes: 70


Ver Perfil
Re: ¿ Me pueden explicar este código ? (Sockets)
« Respuesta #2 en: 2 Septiembre 2015, 16:55 pm »

Código
  1. (struct sockaddr*) &server

Le pasa un puntero a la estructura.

Código
  1. *((int*)fd)
fd es void*, así que primero hace un cast a int*. Luego, accede al valor con la desreferencia (*).

Código
  1. &sin_size

Le pasa un puntero a sin_size.

Muchísimas gracias, ya me ha quedado claro.

Saludos.

PD: Una última pregunta sobre este tema, para que sirve "INADDR_ANY" ?
« Última modificación: 2 Septiembre 2015, 17:05 pm por snake_linux » En línea

someRandomCode

Desconectado Desconectado

Mensajes: 250



Ver Perfil
Re: ¿ Me pueden explicar este código ? (Sockets)
« Respuesta #3 en: 2 Septiembre 2015, 17:22 pm »

INADDR_ANY es un macro definido con un valor que indica que cualquier direccion le sirve para la entrada..
En línea

snake_linux

Desconectado Desconectado

Mensajes: 70


Ver Perfil
Re: ¿ Me pueden explicar este código ? (Sockets)
« Respuesta #4 en: 3 Septiembre 2015, 12:22 pm »

INADDR_ANY es un macro definido con un valor que indica que cualquier direccion le sirve para la entrada..

Gracias, solucionado :)
En línea

Páginas: [1] Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines