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
수 있습니까 ? 이 데이터는 ? 를 호출해야만 얻을 수 있습니다 . 즉, 소켓에는 실제로 / 에 대한 채널 과 / 에 대한 채널이라는 두 개의 서로 다른 채널이 있습니까 ? 아니면 두 개의 일반 메시지 데이터 스트림이 함께 혼합되어 있습니까?msg_iov
recv()
recvmsg()
sendmsg()
recvmsg()
send()
recv()
recvmsg()
그렇지 않은 경우 보조 데이터를 수신하지 않고 일반 메시지 데이터의 여러 헤더를 앞으로 읽은 다음 나중에 호출하여 여러 이전 메시지에 대한 보조 데이터를 가져옴으로써 프로세스가 메시지와 보조 데이터 간의 계약을 위반할 수 있습니까? ? 협회, 뭔가 문제가 있었나요?
보조 데이터가 포함된 메시지 A를 보낸 sendmsg()
다음 보조 데이터 없이 메시지 B를 보내는 경우 메시지 A를 받기 전에 메시지 B를 send()
받을 수 없습니까 ?recv()
recvmsg()
제가 UNIX 도메인 소켓의 기본 메커니즘을 근본적으로 오해했다면 사과드립니다. 혹시 제가 만들고 있는 잘못된 가정을 누구든지 지적해 주시면 감사하겠습니다.