sendmsg() 関数の関数プロトタイプは次のとおりです。
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
msghdr構造は次のとおりです。
struct msghdr {
void *msg_name; /* optional address */
socklen_t msg_namelen; /* size of address */
struct iovec *msg_iov; /* scatter/gather array */
size_t msg_iovlen; /* # elements in msg_iov */
void *msg_control; /* ancillary data, see below */
size_t msg_controllen; /* ancillary data buffer len */
int msg_flags; /* flags on received message */
};
sendmsg()
セカンダリデータmsg_control
(SCM_RIGHTSを含むファイル記述子など)と汎用メッセージデータを含むUNIXドメインソケットを介してメッセージを送信する場合は、ソケット呼び出しを使用してメッセージのもう一方の端から一般データを読み取るmsg_iov
ことができますか?このデータは?を呼び出す必要があります。つまり、ソケットには、実際には/用のチャンネルと/用のチャンネルという2つの異なるチャンネルがありますか?それとも、2つの一般的なメッセージデータストリームが混在していますか?msg_iov
recv()
recvmsg()
sendmsg()
recvmsg()
send()
recv()
recvmsg()
そうでない場合は、セカンダリデータを受信せずに通常のメッセージデータの複数のヘッダーを前に読み取り、後で呼び出して複数の古いメッセージのセカンダリデータを取得することで、プロセスがメッセージとセカンダリデータ間の契約に違反する可能性がありますか? ?協会、何か問題がありましたか?
セカンダリデータを含むメッセージAを送信してsendmsg()
からセカンダリデータなしでメッセージBを送信した場合、メッセージAを受信する前にメッセージBをsend()
受信できませんか?recv()
recvmsg()
私がUNIXドメインソケットの基本的なメカニズムを根本的に誤解した場合はお詫び申し上げます。もし私が作っている間違った仮定を誰でも指摘していただければ幸いです。