UNIXドメインソケット
をテンプレートにして作成
[
トップ
] [
新規
|
一覧
|
検索
|
最終更新
|
ヘルプ
|
ログイン
]
開始行:
* 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 soc...
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 ...
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);
終了行:
* 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 soc...
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 ...
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);
ページ名: