Advertisement
d1cor

sock_unix-server1.c

Oct 4th, 2017
154
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 3.58 KB | None | 0 0
  1. /*******************************************
  2. * Author     : Diego Cordoba / @d1cor      *
  3. * Purpose    : juncotic.com                *
  4. *******************************************/
  5.  
  6. #include<stdio.h>
  7. #include<stdlib.h>
  8. #include<sys/types.h>
  9. #include<sys/stat.h>
  10. #include<unistd.h>
  11. #include<string.h>
  12. #include<fcntl.h>
  13. #include<errno.h>
  14. #include<sys/socket.h>
  15. #include<sys/un.h>
  16.  
  17. #define MSG_SIZE 128
  18. #define SOCK_PATH "/tmp/socket1"
  19.  
  20. int main(int argc, char** argv) {
  21.  
  22.     char *error;
  23.     int sockid;     //id del socket
  24.     struct sockaddr_un direccion;
  25.     char mensaje[MSG_SIZE];
  26.     int count;
  27.  
  28.     if((sockid=socket(PF_UNIX,SOCK_DGRAM,0))<0){
  29.         error="socket";
  30.         goto err;
  31.     }
  32.     /*
  33.        int socket(int domain, int type, int protocol);
  34.         domain: familia de protocolo (PF_)
  35.         type: tipo de socket (DGRAM o STREAM)
  36.         protocol: 0 (unix es un archivo)
  37.  
  38.     */
  39.  
  40.     //cargamos la direccion:
  41.     direccion.sun_family=AF_UNIX;
  42.     strcpy(direccion.sun_path,SOCK_PATH);
  43.  
  44.     /*
  45.     Asociamos la direccion al receptor, "dejar escuchando"
  46.     bind
  47.     int bind(int sockfd, const struct sockaddr *addr, socklen_t addrlen);
  48.             id del socket
  49.             direccion creada
  50.             long de la direccion creada
  51.     */
  52.     if((bind(sockid,(struct sockaddr *)&direccion, sizeof(direccion)))<0){
  53.         error="bind";
  54.         goto err;
  55.     }
  56.     //se crea el archivo del socket
  57.  
  58.  
  59.     /*
  60.     recibimos el dato
  61.         ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
  62.                         struct sockaddr *src_addr, socklen_t *addrlen);
  63.         sockid      id del socket
  64.         buf         dir de memoria donde guardar el mensaje
  65.         len         long max del mensaje
  66.         flags       opcionales, 0 por default
  67.         src_addr    direccion origen, opcional
  68.         addrlen     long de la direccion del origen
  69.     */
  70.  
  71. //  if((count=recvfrom(sockid,mensaje,100,0,NULL,NULL))<0){
  72.     if((count=recv(sockid,mensaje,MSG_SIZE,0))<0){
  73.         error="recvfrom";
  74.         goto err;
  75.     }
  76.     *(mensaje+count)='\0';
  77.     printf("Mensaje leido: %s\n",mensaje);
  78.  
  79.     close(sockid);
  80.     return 0;
  81.  
  82. err:
  83.     fprintf(stderr,"%s %d %s\n",error,errno,strerror(errno));
  84.     exit(1);
  85.  
  86.     return 0;
  87. }
  88.  
  89. /*
  90.  
  91. Familias de sockets (protocol family)
  92.     PF_UNIX locales     archivo tipo socket
  93.     PF_INET red tcp/ip  direccion:puerto
  94.  
  95. Direccion del socket: (address family)
  96.     AF_UNIX
  97.     AF_INET
  98.         SOCK_DGRAM      -> udp
  99.             no confiable
  100.             el emisor envia, el receptor recibe
  101.         SOCK_STREAM     -> tcp
  102.             confiabilidad
  103.             el server espera conexiones
  104.             cdo un cliente se conecta, el server crea un sock de datos(fd)
  105.             el server y cliente interactuan con ese sock de datos
  106.  
  107. Sockets Unix:
  108.     - procesos no relacionados
  109.     - direccion: path
  110.     - socket: archivo
  111.     PF_UNIX
  112.  
  113.     - conceptos de sockets:
  114.         proto de transporte
  115.         puerto origen y destino
  116.         direccion ip origen y destino
  117.         --> socket INET / Internet / TCP/IP
  118.         -> procesos en diferentes equipos
  119.         PF_INET
  120.  
  121. Funciones:
  122.     Emisor
  123.         creamos el socket (socket)
  124.         enviamos datos (sendto)
  125.         la dir es de tipo "struct sockaddr_un"
  126.     Receptor
  127.         creamos el socket (socket)
  128.         bindeamos o asociamos el socket a la direccion (bind)
  129.         recibimos datos (recvfrom)
  130.  
  131.  
  132.            struct sockaddr_un {
  133.                sa_family_t sun_family;               AF_UNIX
  134.                char        sun_path[UNIX_PATH_MAX];  pathname
  135.            };
  136.  
  137.  
  138. Trabajo con un socket:
  139.     receptor
  140.         creamos el struct sockaddr_un
  141.         asignamos los datos de AF y path
  142.         creamos el socket con "socket" -> estructura de datos
  143.         asociamos la dir con el socket: "bind"
  144.         dejamos al proc esperando datos: recvfrom
  145.    
  146.     emisor
  147.         creamos el struct sockaddr_un
  148.         asignamos AF y path
  149.         creamos el socket con "socket"
  150.         enviamos datos a la direccion con "sendto"
  151.  
  152. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement