5

シンプルな Unix データグラム サーバー/クライアントを作成しようとしていますが、いくつか問題があります。私が欲しいのは、データグラムソケットをリッスンし、受信したすべてのメッセージに返信を元の送信者に送信するサーバーです。最初に「サーバー」として使用し、クライアントを C で記述してみることにしsocatました。次のように socat を実行しています。

socat UNIX-DGRAM:/tmp/test.socket,fork EXEC:echo

私の理解の範囲では、これは/tmp/test.socket同じ文字列で受信したものすべてに耳を傾けて返信する必要がありますか? 次に、次のようなクライアント プログラムがあります (わかりやすくするためにエラー チェックを削除しています)。

int s = socket(AF_UNIX, SOCK_DGRAM, 0);
struct sockaddr_un sa;
sa.sun_family = AF_UNIX;
strcpy(sa.sun_path, "/tmp/test.socket");

const char *data = "Testing data";
int err = sendto(s, data, strlen(data), 0, (struct sockaddr *)(&sa), sizeof(struct sockaddr_un));

printf("Sent!\n");

unsigned char *buffer = malloc(BUFFER_LENGTH);
struct sockaddr_storage recv_sa;
int recv_sa_len = 0;
int recv_len = recvfrom(s, buffer, BUFFER_LENGTH, 0, (struct sockaddr *)&recv_sa, &recv_sa_len);

for (int i = 0; i < recv_len; i++) {
    putc(buffer[i], stdout);
}
printf("\n");

パケットを送信し (動作します)、パケットを受信して​​から出力する必要がありますが、プログラムはパケットを受信できないようです。ここで何が間違っているのでしょうか、それとも Unix ソケットについて根本的な誤解がありますか? ありがとう!

4

3 に答える 3

12

Michael Kerrisk の著書 The Linux Programming Interface の第 57 章で公開されているクライアント/サーバー プログラム ( clientserver ) の AF_UNIX SOCK_DGRAM の例を見てください。

于 2013-09-10T06:46:44.650 に答える
-1

エコー サーバーに何も送信しないようにする前に、connectを呼び出す必要があります。

見てみましょう: http://beej.us/guide/bgipc/output/html/multipage/unixsock.html

于 2011-09-06T20:52:36.583 に答える