Linux で複数のプロセス間で IPC 接続を確立したいと考えています。これまで UNIX ソケットを使用したことがないため、これがこの問題に対する正しいアプローチであるかどうかわかりません。
1 つのプロセスがデータ (フォーマットされていない、バイナリ) を受け取り、データグラム プロトコル (つまり、AF_INET を使用した UDP と同様) を使用して、ローカルの AF_UNIX ソケット経由でこのデータを配布します。このプロセスからローカル Unix ソケットに送信されたデータは、同じソケットでリッスンしている複数のクライアントによって受信されます。受信者の数は異なる場合があります。
これを実現するために、次のコードを使用してソケットを作成し、それにデータを送信します (サーバー プロセス)。
struct sockaddr_un ipcFile;
memset(&ipcFile, 0, sizeof(ipcFile));
ipcFile.sun_family = AF_UNIX;
strcpy(ipcFile.sun_path, filename.c_str());
int socket = socket(AF_UNIX, SOCK_DGRAM, 0);
bind(socket, (struct sockaddr *) &ipcFile, sizeof(ipcFile));
...
// buf contains the data, buflen contains the number of bytes
int bytes = write(socket, buf, buflen);
...
close(socket);
unlink(ipcFile.sun_path);
この書き込みは ENOTCONN (「トランスポート エンドポイントが接続されていません」) を報告する errno と共に -1 を返します。これは、現在、このローカルソケットをリッスンしている受信プロセスがないためだと思いますよね?
次に、このソケットに接続するクライアントを作成しようとしました。
struct sockaddr_un ipcFile;
memset(&ipcFile, 0, sizeof(ipcFile));
ipcFile.sun_family = AF_UNIX;
strcpy(ipcFile.sun_path, filename.c_str());
int socket = socket(AF_UNIX, SOCK_DGRAM, 0);
bind(socket, (struct sockaddr *) &ipcFile, sizeof(ipcFile));
...
char buf[1024];
int bytes = read(socket, buf, sizeof(buf));
...
close(socket);
ここで、バインドは失敗します (「アドレスは既に使用されています」)。それで、いくつかのソケットオプションを設定する必要がありますか、それともこれは一般的に間違ったアプローチですか?
コメント/解決策をお寄せいただきありがとうございます!