#author("2024-11-14T17:33:09+09:00","default:honma","honma") #author("2024-11-14T17:36:07+09:00","default:honma","honma") * UNIXドメインソケット [#ke534435] プロセス間通信を行う時に便利なので、サンプルコードをメモ。 ** サーバー実装 [#da2b39ac] listenで待ち受け準備をして、accept待ち。~ データを受信して表示するだけ。 #highlight(c){{ #include <stdio.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #define UNIX_DOMAIN_SOCKET_PATH "/tmp/unix-domain-socket" int main(void) { int sock; struct sockaddr_un sa = {0}; int fd; char buf[128] = {0}; int read_size; // サーバーソケット作成 sock = socket(AF_UNIX, SOCK_STREAM, 0); if (sock == -1) { perror("socket"); return 1; } // struct sockaddr_un 作成 sa.sun_family = AF_UNIX; strcpy(sa.sun_path, UNIX_DOMAIN_SOCKET_PATH); // bind if (bind(sock, (struct sockaddr*) &sa, sizeof(struct sockaddr_un)) == -1) { perror("bind"); goto CLOSE_SOCKET; } // listen if (listen(sock, 128) == -1) { perror("listen"); goto CLOSE_SOCKET; } while (1) { // accept (受信待ち) if ((fd = accept(sock, NULL, NULL)) == -1) { perror("accept"); goto CLOSE_SOCKET; } // read (データ受信) if ((read_size = read(fd, buf, sizeof(buf)-1)) == -1) { perror("read"); close(fd); goto CLOSE_SOCKET; } else { // 受信データの表示 buf[read_size] = '\0'; printf("message: %s\n", buf); } // close (クローズ) if (close(fd) == -1) { perror("close"); goto CLOSE_SOCKET; } // 終端文字列の確認 if (strcmp(buf, "eof") == 0) { break; } } CLOSE_SOCKET: close(sock); return 1; } }} #ref(unix_domain_socket_srv.c) ** クライアント実装 [#g8438fca] connectしたらデータ送信して終了。 #highlight(c){{ #include <stdio.h> #include <unistd.h> #include <errno.h> #include <sys/types.h> #include <sys/socket.h> #include <sys/un.h> #define UNIX_DOMAIN_SOCKET_PATH "/tmp/unix-domain-socket" int main(int argc, char **argv) { int sock; struct sockaddr_un sa = {0}; char buf[128] = {0}; if (argc >= 2) { // 送信データの生成 memcpy(buf, argv[1], strlen(argv[1])); } else { printf("usage: unix_domain_socket_cli <message>\n"); return 1; } // ソケット作成 sock = socket(AF_UNIX, SOCK_STREAM, 0); if (sock == -1) { perror("socket"); return 1; } // struct sockaddr_un 作成 sa.sun_family = AF_UNIX; strcpy(sa.sun_path, UNIX_DOMAIN_SOCKET_PATH); // connect if (connect(sock, (struct sockaddr*) &sa, sizeof(struct sockaddr_un)) == -1) { perror("connect"); goto CLOSE_SOCKET; } // write (データ送信) if (write(sock, buf, strlen(buf)) == -1) { perror("write"); goto CLOSE_SOCKET; } // close (クローズ) if (close(sock) == -1) { perror("close"); } return 0; CLOSE_SOCKET: close(sock); return 1; } }} #highlight(end) #ref(unix_domain_socket_cli.c) #br #htmlinsert(amazon_book.html);