1

のマニュアルに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 (ファイル システムのパス名を含む)] は仕様に違反しているのでしょうか、それとも何か不足しているのでしょうか?

4

1 に答える 1