int recv(int s, void *buf, size_t len, int flags);
int recvfrom(int s, void *buf, size_t len, int flags, struct sockaddr *from, socklen_t *fromlen);
int recvmsg(int s, struct msghdr *msg, int flags);
¸¸ÀÏ fromÀÌ NULLÀÌ ¾Æ´Ï°í ¼ÒÄÏÀÌ ¿¬°á ÁöÇâÇüÀÌ ¾Æ´Ï¶ó¸é, ¸Þ¼¼ÁöÀÇ º»·¡ ÁÖ¼Ò°¡ ä¿öÁø´Ù. ÀÎÀÚ fromlenÀº °ª-°á°ú º¯¼öÀ̸ç from°ú °ü·ÃµÈ ¹öÆÛÀÇ Å©±â·Î ÃʱâȵǸç, ¹Ýȯ½Ã ÀúÀåµÇ´Â ÁÖ¼ÒÀÇ ½ÇÁ¦ Å©±â¸¦ °¡¸®Å°´Â °ªÀ¸·Î ¼öÁ¤µÈ´Ù.
recv È£ÃâÀº º¸Åë ¿¬°áµÈ ¼ÒÄÏ¿¡¼¸¸ »ç¿ëµÈ´Ù. ( connect(2)¸¦ ÂüÁ¶Ç϶ó) ±×¸®°í from ÀÎÀÚ¸¦ °¡Áø recvfrom°ú µ¿ÀÏÇÏ´Ù.
¼ÒÄÏ¿¡ ¸Þ½ÃÁö°¡ ¾ø´Ù¸é, ¸Þ½ÃÁö¸¦ ¹Þ´Â È£ÃâÀº ¸Þ½ÃÁö°¡ µé¾î¿Ã¶§±îÁö ±â´Ù¸®°ÔµÇ¸ç, ¸¸¾à ¼ÒÄÏÀÌ ³Íºí·°Å·( fcntl(2) ÂüÁ¶)À̾ú´Ù¸é °á°ú°ªÀº -1ÀÌ µÇ°í errno¸¦ EAGAINÀ¸·Î ¼³Á¤ÇÑ´Ù. ÀϹÝÀûÀ¸·Î ¸Þ½ÃÁö¸¦ ¹Þ´Â È£ÃâµéÀº ¿ä±¸µÈ ¾çÀ» ¸ðµÎ ä¿ì¸ç ±â´Ù¸®±â º¸´Ù´Â ä¿öÁø ¾çÀ» ¸®ÅÏÇÑ´Ù.
select(2) ³ª poll(2) È£ÃâÀº µ¥ÀÌÅͰ¡ ´õ µµÂøÇÏ¿´´ÂÁö¸¦ °áÁ¤Çϱâ À§ÇØ »ç¿ëµÈ´Ù.
¹Þ´Â ÇÔ¼öµéÀ» À§ÇÑ flags ÀÎÀÚ´Â ´ÙÀ½ °ªµé Áß Çϳª ÀÌ»óÀÇ OR·Î ±¸¼ºµÈ´Ù.:
¿À·ù¸¦ ¹ß»ý½ÃŲ ¿ø·¡ ÆÐŶÀÇ À¯È¿ µ¥ÀÌÅÍ(payload)´Â msg_iovec¸¦ ÅëÇØ º¸Åë µ¥ÀÌÅÍ·Î Àü´ÞµÈ´Ù. ¿À·ù¸¦ ¹ß»ý½ÃŲ µ¥ÀÌÅͱ׷¥ÀÇ ¿ø·¡ µµÂø ÁÖ¼Ò´Â msg_nameÀ» ÅëÇØ Á¦°øµÈ´Ù.
#define SO_EE_ORIGIN_NONE       0
#define SO_EE_ORIGIN_LOCAL      1
#define SO_EE_ORIGIN_ICMP       2
#define SO_EE_ORIGIN_ICMP6      3
struct sock_extended_err
{
    u_int32_t       ee_errno;   /* error number */
    u_int8_t        ee_origin;  /* where the error originated */
    u_int8_t        ee_type;    /* type */
    u_int8_t        ee_code;    /* code */
    u_int8_t        ee_pad;
    u_int32_t       ee_info;    /* additional information */
    u_int32_t       ee_data;    /* other data */
    /* More data may follow */
};
struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);
¿À·ù°¡ Àü´ÞµÈ ÈÄ, ¹Ì°áÀΠä·Î ³²¾Æ ÀÖ´ø ¼ÒÄÏ ¿À·ùµéÀº ´ÙÀ½ ÀúÀåµÈ ¿À·ù¿¡ ±â¹ÝÇÏ¿© ´Ù½Ã ¸¸µé¾îÁö°í ´ÙÀ½ ¼ÒÄÏ ÀÛµ¿½Ã Àü´ÞµÈ´Ù.
recvmsg´Â Á¦°øµÈ ÆÄ¶ó¹ÌÅ͵éÀÇ ¼ö¸¦ ÃÖ¼ÒÈÇϱâ À§ÇØ msghdr ±¸Á¶Ã¼¸¦ »ç¿ëÇÑ´Ù. ÀÌ ±¸Á¶Ã¼´Â <sys/socket.h>¿¡ Á¤ÀÇµÈ °Íó·³ ´ÙÀ½°ú °°Àº ÇüŸ¦ °¡Áö°í ÀÖ´Ù.
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 */
    socklen_t    msg_controllen; /* ancillary data buffer len */
    int          msg_flags;      /* flags on received message */
};
msg_name°ú msg_namelenÀº ¼ÒÄÏÀÌ ¿¬°áµÇÁö ¾Ê¾ÒÀ¸¸é ¸ñÀûÁö ÁÖ¼Ò¸¦ ³ªÅ¸³½´Ù. msg_nameÀº ¾î¶² À̸§µµ ¿øÇÏÁö ¾Ê°Å³ª ÇÊ¿äÇÏÁö ¾Ê´Ù¸é null Æ÷ÀÎÅͷνá ÁÖ¾îÁø´Ù. msg_iov¿Í msg_iovlen Çʵå´Â readv(2)ó·³ scatter-gather À§Ä¡¸¦ °¡¸®Å²´Ù. msg_controllenÀÇ ±æÀ̸¦ °¡Áö°í ÀÖ´Â msg_control´Â ¸Þ¼¼Áö³ª ±âŸ º¸Á¶ µ¥ÀÌÅÍ¿Í °ü·ÃµÈ ´Ù¸¥ ÇÁ·ÎÅäÄÝ Á¦¾î¸¦ À§ÇÑ ¹öÆÛ¸¦ °¡¸®Å²´Ù. recvmsg°¡ È£ÃâµÉ ¶§, msg_controllen´Â msg_control¿¡¼ ÀÌ¿ëÇÒ ¼ö ÀÖ´Â ¹öÆÛÀÇ ±æÀ̸¦ Æ÷ÇÔÇØ¾ß ÇÑ´Ù. ¿¬¼ÓÀûÀΠȣÃâ¿¡ ´ëÇÑ ¹Ýȯ½Ã ¿¬¼ÓµÈ Á¦¾î ¸Þ¼¼ÁöµéÀÇ ±æÀ̸¦ Æ÷ÇÔÇØ¾ß ÇÑ´Ù.
¸Þ¼¼ÁöÀÇ ÇüÅ´ ¾Æ·¡¿Í °°Àº Çü½ÄÀ» °®´Â´Ù.
struct cmsghdr {
    socklen_t   cmsg_len;   /* data byte count, including hdr */
    int         cmsg_level; /* originating protocol */
    int         cmsg_type;  /* protocol-specific type */
/* followed by
    u_char      cmsg_data[]; */
};
º¸Á¶ µ¥ÀÌÅÍ´Â cmsg(3)¿¡¼ Á¤ÀÇµÈ ¸ÅÅ©·Î¿¡ ÀÇÇØ¼¸¸ Á¢±ÙµÇ¾î¾ß ÇÑ´Ù.
¿¹¸¦ µé¾î, ¸®´ª½º´Â ÀÌ º¸Á¶ µ¥ÀÌÅ͸¦ IP ¿É¼ÇÀ̳ª Unix ¼ÒÄÏ¿¡¼ ÆÄÀÏ ±â¼úÀÚµéó·³ È®ÀåµÈ ¿À·ùµéÀ» Àü´ÞÇϱâ À§ÇØ »ç¿ëÇÑ´Ù.
msg_flags Çʵå´Â ¹ÞÀº ¸Þ¼¼Áö¿¡ µû¶ó ¹ÝȯÇÒ ¶§ ¼³Á¤µÈ´Ù. MSG_EOR´Â end-of-record¸¦ ³ªÅ¸³½´Ù. ¹ÝȯµÈ µ¥ÀÌÅͰ¡ ·¹ÄÚµåÀÇ ³¡ÀÌ´Ù. (ÀϹÝÀûÀ¸·Î SOCK_SEQPACKET Çü½ÄÀÇ ¼ÒÄÏÀÏ ¶§ »ç¿ëµÈ´Ù.) MSG_TRUNC´Â µ¥ÀÌÅͱ׷¥ÀÇ ³¡ ºÎºÐÀ» ¹ö·È´Ù´Â °ÍÀ» ³ªÅ¸³½´Ù. ¿Ö³ÄÇÏ¸é µ¥ÀÌÅͱ׷¥ÀÌ Á¦°øµÇ´Â ¹öÆÛº¸´Ù Å©±â ¶§¹®ÀÌ´Ù.
MSG_CTRUNC´Â ¸î¸î Á¦¾î µ¥ÀÌÅ͵éÀ» º¸Á¶ µ¥ÀÌÅ͸¦ À§ÇÑ ¹öÆÛ °ø°£ÀÌ ºÎÁ·Çϱ⠶§¹®¿¡ ¹ö·È´Ù´Â °ÍÀ» ³ªÅ¸³½´Ù. MSG_OOB´Â ±ÞÇϰųª out-of-band µ¥ÀÌÅ͸¦ ¹Þ¾Ò´Ù´Â °ÍÀ» °¡¸®Å°±â À§ÇØ ¹ÝȯµÈ´Ù. MSG_ERRQUEUE´Â ¾î¶² µ¥ÀÌÅ͵µ ¹ÞÁö ¾Ê¾ÒÁö¸¸ ¼ÒÄÏ ¿À·ù Å¥¿¡¼ ¿À·ù°¡ È®ÀåµÇ¾ú´Ù´Â °ÍÀ» ³ªÅ¸³½´Ù.