d1cor

sock_inet_stream_srv_multithread.c

Nov 1st, 2017
152
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.17 KB | None | 0 0
  1. /*******************************************
  2. * Author     : Diego Cordoba / @d1cor      *
  3. * Purpose    : juncotic.com  / um.edu.ar   *
  4. *******************************************/
  5.  
  6. /*
  7.     Uso:
  8.         ./servidor <puerto>
  9. */
  10.  
  11.  
  12. #include<stdio.h>
  13. #include<stdlib.h>
  14. #include<sys/types.h>
  15. #include<sys/stat.h>
  16. #include<unistd.h>
  17. #include<string.h>
  18. #include<fcntl.h>
  19. #include<errno.h>
  20. #include<sys/socket.h>
  21. #include<netinet/in.h>
  22. #include<pthread.h>
  23.  
  24. #define BUF_SIZE 1024
  25.  
  26. void* sock_handler(void* dato);
  27.  
  28. int main(int argc, char** argv) {
  29.  
  30.     char *error;
  31.  
  32.     int sockid, conn_sock, count;
  33.     struct sockaddr_in direccion;
  34.     char buffer[BUF_SIZE];
  35.     int pid;
  36.     pthread_t thread_id;
  37.  
  38.  
  39.     //creamos el socket inet-stream
  40.     if((sockid=socket(PF_INET,SOCK_STREAM,0))<0){
  41.         error="socket";
  42.         goto err;
  43.     }
  44.  
  45.  
  46.     //seteamos la direccion en la que va a escuchar
  47.     direccion.sin_family=AF_INET; //address family
  48.     direccion.sin_port=htons(atoi(*(argv+1)));  //atoi ascii to integer
  49.     direccion.sin_addr.s_addr=htonl(INADDR_ANY); //0.0.0.0
  50.  
  51.  
  52.     //asociamos el socket con la direccion (bind)
  53.     if((bind(sockid, (struct sockaddr *)&direccion, sizeof(direccion)))<0){
  54.         error="bind";
  55.         goto err;
  56.     }
  57.  
  58.  
  59.     // seteamos la cantidad de conexiones concurrentes en cola
  60.     listen(sockid,1);
  61.  
  62.  
  63.     //dejamos escuchando al proceso en el socket ip:puerto
  64.     while(conn_sock=accept(sockid,NULL,NULL)){
  65.         if (conn_sock<0){
  66.             error="accept";
  67.             goto err;
  68.         }
  69.  
  70.         if(pthread_create(&thread_id,NULL,sock_handler, (void*)&conn_sock)){
  71.             error="pthread_create";
  72.             goto err;
  73.         }
  74.  
  75.         printf("Conexion delegada al hilo %li\n",thread_id);
  76.     }
  77.  
  78.  
  79.  
  80.     // ya tenemos un conn_sock de datos asociado con el cliente conectado
  81.     return 0;
  82.  
  83. err:
  84.     fprintf(stderr,"%d %s %s\n",errno,error,strerror(errno));
  85.     exit(1);
  86.  
  87. }
  88.  
  89.  
  90. void* sock_handler(void* dato){
  91.     char buffer[BUF_SIZE];
  92.     int conn_sock_th, count;
  93.     pthread_detach(pthread_self());
  94.  
  95.     conn_sock_th = *((int*)dato);
  96.  
  97.     printf("Iniciando hilo %li\n",pthread_self());
  98.  
  99.     while(count=recv(conn_sock_th,buffer,BUF_SIZE,0)){
  100.         *(buffer+count)='\0';
  101.         printf("Recibiendo datos (%li): %s\n",pthread_self(),buffer);
  102.     }
  103.     close(conn_sock_th);
  104.     pthread_exit(NULL);
  105.  
  106. }
Add Comment
Please, Sign In to add comment