參考資訊:
https://troydhanson.github.io/network/Unix_domain_sockets.html
Domain Socket不需要使用Port且是透過File System機制做傳輸
server.c
#include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <sys/un.h> #include <unistd.h> int main(int argc, char *argv[]) { int cl = 0; int fd = -1; char buf[255] = {0}; struct sockaddr_un addr = {0}; const char *path = "./domain_socket"; unlink(path); fd = socket(AF_UNIX, SOCK_STREAM, 0); addr.sun_family = AF_UNIX; strcpy(addr.sun_path, path); bind(fd, (struct sockaddr *)&addr, sizeof(addr)); listen(fd, 5); cl = accept(fd, NULL, NULL); while (read(cl, buf, sizeof(buf))) { printf("read: \"%s\"\n", buf); } close(cl); return 0; }
client.c
#include <stdio.h> #include <stdlib.h> #include <sys/socket.h> #include <sys/un.h> #include <unistd.h> int main(int argc, char *argv[]) { int fd = -1; char buf[255] = {"I am error !"}; struct sockaddr_un addr = {0}; fd = socket(AF_UNIX, SOCK_STREAM, 0); addr.sun_family = AF_UNIX; strcpy(addr.sun_path, "./domain_socket"); connect(fd, (struct sockaddr *)&addr, sizeof(addr)); write(fd, buf, strlen(buf)); close(fd); return 0; }
編譯、執行
$ gcc server.c -o server $ gcc client.c -o client $ ./server& $ ls -al ./domain_socket srwxr-xr-x 1 steward steward 0 Dec 1 01:21 domain_socket $ ./client read: "I am error !"