Advertisement
d1cor

sock_unix-server2.c

Oct 4th, 2017
151
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.71 KB | None | 0 0
  1. /*******************************************
  2. * Author     : Diego Cordoba / @d1cor      *
  3. * Purpose    : Junco TIC                   *
  4. * Contact    : juncotic.com                *
  5. *******************************************/
  6.  
  7. #include<stdio.h>
  8. #include<stdlib.h>
  9. #include<sys/types.h>
  10. #include<sys/stat.h>
  11. #include<unistd.h>
  12. #include<string.h>
  13. #include<fcntl.h>
  14. #include<errno.h>
  15. #include<sys/socket.h>
  16. #include<sys/un.h>
  17.  
  18. #define MSG_SIZE 128
  19.  
  20. void usage(char* progname){
  21.     printf("Usage:\n\t%s <pathname>\n\n",progname);
  22. }
  23.  
  24.  
  25. int main(int argc, char** argv) {
  26.  
  27.     char *error;
  28.     int sockid;     //id del socket
  29.     struct sockaddr_un direccion;
  30.     char mensaje[MSG_SIZE];
  31.     int count;
  32.  
  33.     if(argc<2){
  34.         usage(*argv);
  35.         exit(1);
  36.     }
  37.  
  38.     if((sockid=socket(PF_UNIX,SOCK_DGRAM,0))<0){
  39.         error="socket";
  40.         goto err;
  41.     }
  42.  
  43.     //cargamos la direccion:
  44.     direccion.sun_family=AF_UNIX;
  45.     strcpy(direccion.sun_path,*(argv+1));
  46.  
  47.     if((bind(sockid,(struct sockaddr *)&direccion, sizeof(direccion)))<0){
  48.         error="bind";
  49.         goto err;
  50.     }
  51.     //se crea el archivo del socket
  52.  
  53.  
  54.     while(count=recv(sockid,mensaje,MSG_SIZE,0)){
  55.         if(count<0){
  56.             error="recvfrom";
  57.             goto err;
  58.         }
  59.         printf("Mensaje leido: %s",mensaje);
  60.         if(!strcmp(mensaje,"exit\n")){
  61.             printf("Gracias por participar\n");
  62.             break;
  63.         }
  64.     }
  65.  
  66.     close(sockid);
  67.     unlink(*(argv+1));
  68.     return 0;
  69.  
  70. err:
  71.     fprintf(stderr,"%s %d %s\n",error,errno,strerror(errno));
  72.     exit(1);
  73.  
  74.     return 0;
  75. }
  76.  
  77. /*
  78.  
  79. Familias de sockets (protocol family)
  80.     PF_UNIX
  81.     PF_INET
  82.  
  83. Direccion del socket: (address family)
  84.     AF_UNIX
  85.     AF_INET
  86.         SOCK_DGRAM      -> udp
  87.         SOCK_STREAM     -> tcp
  88.  
  89. Sockets Unix:
  90.     - procesos no relacionados
  91.     - direccion: path
  92.     - socket: archivo
  93.     PF_UNIX
  94.  
  95.     - conceptos de sockets:
  96.         proto de transporte
  97.         puerto origen y destino
  98.         direccion ip origen y destino
  99.         --> socket INET / Internet / TCP/IP
  100.         -> procesos en diferentes equipos
  101.         PF_INET
  102.  
  103. Funciones:
  104.     Emisor
  105.         creamos el socket (socket)
  106.         enviamos datos (sendto)
  107.         la dir es de tipo "struct sockaddr_un"
  108.     Receptor
  109.         creamos el socket (socket)
  110.         bindeamos o asociamos el socket a la direccion (bind)
  111.         recibimos datos (recvfrom)
  112.  
  113.  
  114.            struct sockaddr_un {
  115.                sa_family_t sun_family;               AF_UNIX
  116.                char        sun_path[UNIX_PATH_MAX];  pathname
  117.            };
  118.  
  119.  
  120. Trabajo con un socket:
  121.     receptor
  122.         creamos el struct sockaddr_un
  123.         asignamos los datos de AF y path
  124.         creamos el socket con "socket" -> estructura de datos
  125.         asociamos la dir con el socket: "bind"
  126.         dejamos al proc esperando datos: recvfrom
  127.    
  128.     emisor
  129.         creamos el struct sockaddr_un
  130.         asignamos AF y path
  131.         creamos el socket con "socket"
  132.         enviamos datos a la direccion con "sendto"
  133.  
  134. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement