AF_UNIX 僅限同主機進程通訊,比 AF_INET 省去網路協議棧開銷,延遲更低。
int sfd = socket(AF_UNIX, SOCK_DGRAM, 0);
struct sockaddr_un srv_addr = {0};
srv_addr.sun_family = AF_UNIX;
strncpy(srv_addr.sun_path, SOCKET_PATH, sizeof(srv_addr.sun_path)-1);
unlink(SOCKET_PATH); // 確保路徑不存在
bind(sfd, (struct sockaddr*)&srv_addr, sizeof(srv_addr));
struct sockaddr_un cli_addr;
socklen_t len = sizeof(cli_addr);
char buf[128];
recvfrom(sfd, buf, sizeof(buf), 0, (struct sockaddr*)&cli_addr, &len);
printf("[server] received: %s\n", buf);
close(sfd);
unlink(SOCKET_PATH);
int cfd = socket(AF_UNIX, SOCK_DGRAM, 0);
struct sockaddr_un srv_addr = {0};
srv_addr.sun_family = AF_UNIX;
strncpy(srv_addr.sun_path, SOCKET_PATH, sizeof(srv_addr.sun_path)-1);
char buf[] = "hello";
sendto(cfd, buf, sizeof(buf), 0, (struct sockaddr*)&srv_addr, sizeof(srv_addr));
printf("[client] sent: %s\n", buf);
close(cfd);
gcc server.c -o server
gcc client.c -o client
./server &
./client
[client] sending data (hello ) to server by socket
[server] receiving data (hello) from client by socket
注意:SOCKET_PATH 需雙方一致;伺服器需先 unlink 避免 bind 失敗。