¿ Me pueden explicar este código ? (Sockets)

Iniciado por snake_linux, 2 Septiembre 2015, 12:11 PM

0 Miembros y 4 Visitantes están viendo este tema.

snake_linux

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:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <strings.h>
#include <unistd.h>
#include <pthread.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#define PORT 1024
#define BACKLOG 2

void* do_some_thing(void*);

int main()
{
  int fd;
  struct sockaddr_in server;

  pthread_t thread1;

  /* Limpiamos la pantalla */
  system("clear");

  /* Creamos el socket */
  if ((fd=socket(AF_INET, SOCK_STREAM, 0)) == -1)
  {
     printf("\t*error en la creacion del socket\n");
     return -1;
  }
  server.sin_family = AF_INET;
  server.sin_port = htons(PORT);
  server.sin_addr.s_addr = INADDR_ANY;
  bzero(&(server.sin_zero), 8);

  if(bind(fd, (struct sockaddr*) &server, sizeof(struct sockaddr)) == -1)
  {
     printf("\t*error en el BIND\n");
          return -1;
  }
  /* Ponemos el socket a la escucha */
  if(listen(fd, BACKLOG) == -1)
  {
     printf("\t*error en el LISTEN\n");
          return -1;
  }
  if(pthread_create( &thread1, NULL, do_some_thing, &fd) != 0)
  {
     printf("\t*error en pthread_create\n");
     return -1;
  }
  if(pthread_join( thread1, NULL) != 0)
  {
     printf("\t*error en pthread_join\n");
     return -1;
  }
  printf("***SERVER DONE***\n");
  return 0;
}

void* do_some_thing(void* fd)
{
  int fd2;
  struct sockaddr_in client;
  socklen_t sin_size;
  char Buffer[100];

  sin_size = sizeof(struct sockaddr_in);

  fd2 = accept(*((int*)fd), (struct sockaddr*)&client, &sin_size);
  printf("***SERVER START***\n");
  while (sin_size != 0)
  {
     sin_size= recv(fd2, Buffer, 100,0);
     if (sin_size > 0)
     {
        Buffer[sin_size-1]='\0';
        printf("Cadena Recibida: %s\n", Buffer);

        if(!strcmp(Buffer, "salir")) sin_size= 0;
     }
  }
  if(close(fd2) != 0)
  {
     printf("\t*error en close thread\n");
     return (void*)-1;
  }
  fd2 = 0;
  printf("GOOD BYE\n");
  return NULL;
}


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.

ivancea96

(struct sockaddr*) &server

Le pasa un puntero a la estructura.

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

&sin_size

Le pasa un puntero a sin_size.

snake_linux

#2
Cita de: ivancea96 en  2 Septiembre 2015, 14:27 PM
(struct sockaddr*) &server

Le pasa un puntero a la estructura.

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

&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" ?

someRandomCode

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

snake_linux

Cita de: someRandomCode 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..

Gracias, solucionado :)