AF_UNIX: sendmsg()로 전송된 메시지를 수신하려면 recv()를 사용하십시오.

AF_UNIX: sendmsg()로 전송된 메시지를 수신하려면 recv()를 사용하십시오.

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_iovrecv()recvmsg()sendmsg()recvmsg()send()recv()

recvmsg()그렇지 않은 경우 보조 데이터를 수신하지 않고 일반 메시지 데이터의 여러 헤더를 앞으로 읽은 다음 나중에 호출하여 여러 이전 메시지에 대한 보조 데이터를 가져옴으로써 프로세스가 메시지와 보조 데이터 간의 계약을 위반할 수 있습니까? ? 협회, 뭔가 문제가 있었나요?

보조 데이터가 포함된 메시지 A를 보낸 sendmsg()다음 보조 데이터 없이 메시지 B를 보내는 경우 메시지 A를 받기 전에 메시지 B를 send()받을 수 없습니까 ?recv()recvmsg()

제가 UNIX 도메인 소켓의 기본 메커니즘을 근본적으로 오해했다면 사과드립니다. 혹시 제가 만들고 있는 잘못된 가정을 누구든지 지적해 주시면 감사하겠습니다.

관련 정보