Advertisement
d1cor

sock_unix-client2.c

Oct 4th, 2017
166
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 2.64 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. //emisor
  21.  
  22. void usage(char* progname){
  23.     printf("Usage:\n\t%s <pathname>\n\n",progname);
  24. }
  25.  
  26. int main(int argc, char** argv) {
  27.  
  28.     char *error;
  29.     int sockid;     //id del socket
  30.     struct sockaddr_un direccion;
  31.     char mensaje[MSG_SIZE];
  32.     int count;
  33.  
  34.     if(argc<2){
  35.         usage(*argv);
  36.         exit(1);
  37.     }
  38.  
  39.     if((sockid=socket(PF_UNIX,SOCK_DGRAM,0))<0){
  40.         error="socket";
  41.         goto err;
  42.     }
  43.  
  44.     //cargamos la direccion:
  45.     direccion.sun_family=AF_UNIX;
  46.     strcpy(direccion.sun_path,*(argv+1));
  47.  
  48.     //enviamos datos al socket:
  49.     while(count=read(STDIN_FILENO,mensaje,MSG_SIZE)){
  50.         *(mensaje+count)='\0';
  51.         if((sendto(sockid,mensaje,count+1,0,(struct sockaddr *)&direccion,sizeof(direccion)))<0){
  52.             error="sendto";
  53.             goto err;
  54.         }
  55.         printf("Enviado...\n");
  56.         if(!strcmp(mensaje,"exit\n")){
  57.             printf("Saliendo...\n");
  58.             break;
  59.         }
  60.     }
  61.  
  62.  
  63.     /*
  64.     ssize_t sendto(int sockfd, const void *buf, size_t len, int flags, const struct sockaddr *dest_addr, socklen_t addrlen);
  65.         sockfd      socket id o file-descriptor del socket Unix
  66.         buf         buffer donde esta el mensaje
  67.         len         longitud del mensaje a enviar
  68.         flags       flags, 0 por default
  69.         dest_addr   direccion del destinatario
  70.         addrlen     long de la direccion
  71.     */
  72.  
  73.     close(sockid);
  74.     return 0;
  75.  
  76. err:
  77.     fprintf(stderr,"%s %d %s\n",error,errno,strerror(errno));
  78.     exit(1);
  79.  
  80.     return 0;
  81. }
  82.  
  83. /*
  84.  
  85. Familias de sockets (protocol family)
  86.     PF_UNIX
  87.     PF_INET
  88.  
  89. Direccion del socket: (address family)
  90.     AF_UNIX
  91.     AF_INET
  92.         SOCK_DGRAM      -> udp
  93.         SOCK_STREAM     -> tcp
  94.  
  95. Sockets Unix:
  96.     - procesos no relacionados
  97.     - direccion: path
  98.     - socket: archivo
  99.     PF_UNIX
  100.  
  101.     - conceptos de sockets:
  102.         proto de transporte
  103.         puerto origen y destino
  104.         direccion ip origen y destino
  105.         --> socket INET / Internet / TCP/IP
  106.         -> procesos en diferentes equipos
  107.         PF_INET
  108.  
  109. Funciones:
  110.     Emisor
  111.         creamos el socket (socket)
  112.         enviamos datos (sendto)
  113.         la dir es de tipo "struct sockaddr_un"
  114.     Receptor
  115.         creamos el socket (socket)
  116.         bindeamos o asociamos el socket a la direccion (bind)
  117.         recibimos datos (recvfrom)
  118.  
  119.  
  120.            struct sockaddr_un {
  121.                sa_family_t sun_family;               AF_UNIX
  122.                char        sun_path[UNIX_PATH_MAX];  pathname
  123.            };
  124.  
  125.  
  126.  
  127. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement