d1cor

sock_inet_stream_srv_multiproc_io.c

Nov 1st, 2017
144
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.14 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<sys/wait.h>
  22. #include<netinet/in.h>
  23.  
  24. #define BUF_SIZE 1024
  25.  
  26. int main(int argc, char** argv) {
  27.  
  28.     char *error;
  29.  
  30.     int sockid, conn_sock, count;
  31.     struct sockaddr_in direccion;
  32.     char buffer[BUF_SIZE];
  33.     int pid;
  34.  
  35.  
  36.     //creamos el socket inet-stream
  37.     if((sockid=socket(PF_INET,SOCK_STREAM,0))<0){
  38.         error="socket";
  39.         goto err;
  40.     }
  41.  
  42.  
  43.     //seteamos la direccion en la que va a escuchar
  44.     direccion.sin_family=AF_INET; //address family
  45.     direccion.sin_port=htons(atoi(*(argv+1)));  //atoi ascii to integer
  46.     direccion.sin_addr.s_addr=htonl(INADDR_ANY); //0.0.0.0
  47.  
  48.  
  49.     //asociamos el socket con la direccion (bind)
  50.     if((bind(sockid, (struct sockaddr *)&direccion, sizeof(direccion)))<0){
  51.         error="bind";
  52.         goto err;
  53.     }
  54.  
  55.  
  56.     // seteamos la cantidad de conexiones concurrentes en cola
  57.     listen(sockid,1);
  58.  
  59.     //dejamos escuchando al proceso en el socket ip:puerto
  60.     while(conn_sock=accept(sockid,NULL,NULL)){
  61.         if (conn_sock<0){
  62.             error="accept";
  63.             goto err;
  64.         }
  65.  
  66.         if (!(pid=fork())){     //proceso hijo
  67.             while(count=recv(conn_sock,buffer,BUF_SIZE,0)){
  68.                 if (count < 0){
  69.                     error="recv";
  70.                     goto err;
  71.                 }
  72.    
  73.                 *(buffer+count)='\0';
  74.                 printf("%d recibiendo datos: %s",getpid(),buffer);
  75.                 printf("%d enviando notificacion\n",getpid());
  76.                 count=sprintf(buffer,"Notificacion del proceso %d\n",getpid());
  77.                 *(buffer+count)='\0';
  78.                 if((send(conn_sock,buffer,count+1,0))<0){
  79.                     error="send";
  80.                     goto err;
  81.                 }
  82.  
  83.             }
  84.             close(sockid);
  85.             exit(0);
  86.         }
  87.  
  88.         printf("Conexion delegada al proceso hijo No. %d\n",pid);
  89.         waitpid(pid,NULL,WNOWAIT);
  90.     }
  91.  
  92.  
  93.  
  94.     // ya tenemos un conn_sock de datos asociado con el cliente conectado
  95.     return 0;
  96.  
  97. err:
  98.     fprintf(stderr,"%d %s %s\n",errno,error,strerror(errno));
  99.     exit(1);
  100.  
  101. }
Add Comment
Please, Sign In to add comment