のマニュアルにconnect
は次のように書かれています。
ソケット sockfd が SOCK_DGRAM タイプの場合、 addr はデフォルトでデータグラムが送信されるアドレスであり、データグラムが受信される唯一のアドレスです。
次の C プログラムは、接続先 ( ) 以外のアドレス ( ) からメッセージを受信し、終了するため、UNIX ドメイン ソケット上のconnect
/の Linux 実装でのエラーを明らかにしているようです。それとは対照的に、私が期待する動作は、プログラムが終了しないということです。これは、接続先のアドレスからのメッセージが到着しないのを忠実に待つためです。(戻り値のチェックと print ステートメントで例を意図的に混乱させませんでした。これは、 で簡単に調べることができるためです。実際には、呼び出しはさまざまなプロセスによって行われます。)recv
@"PWE0"
@"STAR"
strace
#include <sys/socket.h>
char header[] = "PLD ";
int main()
{
#define addrlen sizeof(unsigned short) + sizeof (char [1+4]) + sizeof(int)
int fd = socket(PF_UNIX, SOCK_DGRAM, 0);
bind(fd, &(struct sockaddr){ AF_UNIX, "\0PLD " }, addrlen);
int gd = socket(PF_UNIX, SOCK_DGRAM, 0);
bind(gd, &(struct sockaddr){ AF_UNIX, "\0STAR" }, addrlen);
int hd = socket(PF_UNIX, SOCK_DGRAM, 0);
bind(hd, &(struct sockaddr){ AF_UNIX, "\0PWE0" }, addrlen);
sendto(hd, "PWE0\0\0\0\n\1h\0\0\0\1\0\0\0\1", 18, 0,
&(struct sockaddr){ AF_UNIX, "\0PLD " }, addrlen);
connect(fd, &(struct sockaddr){ AF_UNIX, "\0STAR" }, addrlen);
char buf[32];
return recv(fd, buf, sizeof buf, 0);
}
では、Linux [および HP-UX (ファイル システムのパス名を含む)] は仕様に違反しているのでしょうか、それとも何か不足しているのでしょうか?