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 È£ÃâÀº º¸Åë connected µÈ ¼ÒÄÏ¿¡¼¸¸ »ç¿ëµÈ´Ù. ( connect(2)¸¦ ÂüÁ¶Çضó) ±×¸®°í from ÀÎÀÚ¸¦ °¡Áø recvfrom ¿Í µ¿ÀÏÇÏ´Ù.
¼¼ ·çƾ ¸ðµÎ ¼º°øÀûÀÎ ¿Ï¼º½Ã ¸Þ¼¼ÁöÀÇ ±æÀ̸¦ ¹ÝȯÇÑ´Ù. ¸¸ÀÏ ¸Þ¼¼Áö°¡ Á¦°øµÇ´Â ¹öÆÛº¸´Ù ´õ Å©´Ù¸é, ÃÊ°úµÈ ¹ÙÀÌÆ®µéÀº ¸Þ¼¼Áö¸¦ ¹ÞÀº ¼ÒÄÏ Å¸ÀÔ¿¡ ÀÇÁ¸ÇÏ¿© ¹ö·ÁÁø´Ù.( socket(2)¸¦ ÂüÁ¶Çضó).
¸¸ÀÏ ¾î¶² ¸Þ¼¼Áöµéµµ ¼ÒÄÏ¿¡¼ ÀÌ¿ëÇÒ¼ö ¾ø´Ù¸é, ¹Þ´Â ¼ÒÄÏ È£Ãâ ÇÔ¼öµéÀº ¸¸ÀÏ -1À» ¹ÝȯÇÏ°í ¿ÜºÎ º¯¼ö errno ¸¦ EAGAINÀ¸·Î ¼³Á¤ÇÏ´Â °æ¿ìÀÇ nonblockingÀÌ ¾Æ´Ï¶ó¸é ¸Þ¼¼Áö°¡ µµÂøÇÒ¶§±îÁö ±â´Ù¸°´Ù.( fcntl(2)¸¦ ÂüÁ¶Çضó.) ¸Þ¼¼Áö¸¦ ¹Þ´Â ÇÔ¼öµéÀº º¸Åë ¿ä±¸µÈ ¿ÏÀüÇÑ ¾çÀ» ±â´Ù¸®±â º¸´Ù´Â ¿ä±¸µÈ ¾ç±îÁö ÀÌ¿ëÇÒ¼ö ÀÖ´Â µ¥ÀÌŸ¸¦ ¹ÝȯÇÑ´Ù.
select(2) ³ª poll(2) È£ÃâÀº µ¥ÀÌÅÍ°¡ ´õ µµÂøÇÏ¿´´ÂÁö¸¦ °áÁ¤Çϱâ À§ÇØ »ç¿ëµÈ´Ù.
¹Þ´Â ÇÔ¼öµéÀ» À§ÇÑ flags ÀÎÀÚ´Â ´ÙÀ½ °ªµé Áß ÇϳªÀÌ»óÀÇ OR·Î ±¸¼ºµÈ´Ù.:
º¸Á¶ ¸Þ¼¼Áöµé¿¡¼ ´õ ¸¹Àº Á¤º¸¸¦ ¿øÇϸé cmsg(3)¸¦ ÂüÁ¶Çضó
¿¡·¯´Â sock_extended_err ±¸Á¶Ã¼·Î Á¦°øµÈ´Ù:
#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 *SOCK_EE_OFFENDER(struct sock_extended_err *);
¸¸ÀÏ ÀÌ ÁÖ¼Ò°¡ ¾Ë·ÁÁöÁö ¾Ê¾Ò´Ù¸é, sockaddr ÀÇ ¸â¹öÀÎ sa_family ´Â AF_UNSPEC ¸¦ Æ÷ÇÔÇϸç sockaddr ÀÇ ´Ù¸¥ ÇʵåµéÀº Á¤ÀǵÇÁö ¾Ê´Â´Ù. ¿¡·¯¸¦ ¾ß±âÇÑ ÆÐŶÀº º¸Åë µ¥ÀÌÅÍó·³ Àü´ÞµÈ´Ù.
¿¡·¯°¡ Àü´ÞµÈÈÄ, ¹Ì°áÀÎä·Î ³²¾Æ ÀÖ´ø ¼ÒÄÏ ¿¡·¯µéÀº ´ÙÀ½ Å¥µÈ ¿¡·¯¿¡ ±â¹ÝÇÏ¿© ´Ù½Ã ¸¸µé¾îÁö°í ´ÙÀ½ ¼ÒÄÏ ÀÛµ¿½Ã Àü´ÞµÈ´Ù.
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 À§Ä¡¸¦ °¡¸®Å²´Ù.
The field which has length msg_controllenÀÇ ±æÀ̸¦ °¡Áö°í ÀÖ´Â msg_control´Â ¸Þ¼¼Áö³ª ±âŸ º¸Á¶ µ¥ÀÌÅÍ¿Í °ü·ÃµÈ ´Ù¸¥ ÇÁ·ÎÅäÄÝ Á¦·¯¸¦ À§ÇÑ ¹öÆÛ¸¦ °¡¸®Å²´Ù. recvmsg °¡ È£ÃâµÉ¶§, is called, ´Â 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 ´Â ¾î¶² µ¥ÀÌÅ͵µ ¹ÞÁö ¾Ê¾ÒÁö¸¸ ¼ÒÄÏ ¿¡·¯ Å¥¿¡¼ ¿¡·¯°¡ È®ÀåµÇ¾ú´Ù´Â °ÍÀ» °¡¸® Ų´Ù.