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´Â ¾î¶² µ¥ÀÌÅ͵µ ¹ÞÁö ¾Ê¾ÒÁö¸¸ ¼ÒÄÏ ¿À·ù Å¥¿¡¼ ¿À·ù°¡ È®ÀåµÇ¾ú´Ù´Â °ÍÀ» ³ªÅ¸³½´Ù.