Linux socket programming - PF_UNIX/PF_LOCAL

PF_UNIX, PF_LOCAL    Local communication        man 7 unix                                                                               

example code

sock_server.c
       #include <sys/socket.h>
       #include <sys/un.h>
       #include <stdlib.h>
       #include <stdio.h>
       #include <string.h>

       #define MY_SOCK_PATH "/tmp/test_path"
       #define LISTEN_BACKLOG 50

       #define handle_error(msg)
           do { perror(msg); exit(EXIT_FAILURE); } while (0)

       int
       main(int argc, char argv[])
       {
           int fd, conn_fd;
           struct sockaddr_un my_addr, peer_addr;
           socklen_t peer_addr_size;

           fd = socket(PF_UNIX, SOCK_STREAM, 0);
           if (fd == -1)
               handle_error("socket");

           memset(&my_addr, 0, sizeof(struct sockaddr_un));
           my_addr.sun_family = AF_UNIX;
           // using an abstract path, 不会真正创建相应的文件
           strncpy(&my_addr.sun_path[1], MY_SOCK_PATH,
                   sizeof(my_addr.sun_path) - 1);

           if (bind(fd, (struct sockaddr
) &my_addr,
                   sizeof(struct sockaddr_un)) == -1)
               handle_error("bind");

           if (listen(fd, LISTEN_BACKLOG) == -1)
               handle_error("listen");

           / Now we can accept incoming connections one
              at a time using accept(2)
/
           while(1) {
               char buf[255];
               peer_addr_size = sizeof(struct sockaddr_un);
               conn_fd = accept(fd, (struct sockaddr ) &peer_addr,
                            &peer_addr_size);
               if (conn_fd == -1)
                   handle_error("accept");

               /
Code to deal with incoming connection(s)… /
               recv(conn_fd, buf, 255, 0);
               printf("%sn", buf);
               close(conn_fd);
               break;
           }
           /
When no longer required, the socket pathname, MY_SOCK_PATH
              should be deleted using unlink(2) or remove(3) /
           remove(MY_SOCK_PATH);
       }

sock_client.c
       #include <sys/socket.h>
       #include <sys/un.h>
       #include <stdlib.h>
       #include <stdio.h>
       #include <string.h>

       #define MY_SOCK_PATH "/tmp/test_path"
       #define LISTEN_BACKLOG 50

       #define handle_error(msg)
           do { perror(msg); exit(EXIT_FAILURE); } while (0)

       int
       main(int argc, char
argv[])
       {
           int fd;
           struct sockaddr_un serv_addr;

           fd = socket(PF_UNIX, SOCK_STREAM, 0);
           if (fd == -1)
               handle_error("socket");

           memset(&serv_addr, 0, sizeof(struct sockaddr_un));
                               / Clear structure /
           serv_addr.sun_family = AF_UNIX;
           strncpy(&serv_addr.sun_path[1], MY_SOCK_PATH,
                   sizeof(serv_addr.sun_path) - 1);

           if(-1 == connect(fd, (const struct sockaddr *)&serv_addr, sizeof(serv_addr)))
               handle_error("connect");

           send(fd, "hello", sizeof("hello"), 0);

           close(fd);

       }








end