#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);

トップ   編集 差分 履歴 添付 複製 名前変更 リロード   新規 一覧 検索 最終更新   ヘルプ   最終更新のRSS