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