RECV

Section: ¸®´ª½º ÇÁ·Î±×·¡¸Ó ¸Å´º¾ó (2)
Updated: 1999³â 4¿ù
Index
Return to Main Contents
 

À̸§

recv, recvfrom, recvmsg - ¼ÒÄÏÀ¸·ÎºÎÅÍ ¸Þ¼¼Áö¸¦ ¹Þ´Â´Ù.  

»ç¿ë¹ý

#include <sys/types.h>
#include <sys/socket.h>

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);  

¼³¸í

recvfrom ±×¸®°í recvmsg ´Â ¿¬°á ÁöÇâÇüÀ̵çÁö ¾Æ´ÏµçÁö ¼ÒÄÏ¿¡¼­ ¸Þ¼¼Áö¸¦ ¹Þ±â À§ÇØ »ç¿ëµÈ´Ù. ±×¸®°í ¼ÒÄÏ¿¡ ÀÖ´Â µ¥ÀÌÅ͸¦ ¹Þ±â À§ÇØ »ç¿ëµÈ´Ù.

¸¸ÀÏ from °¡ NULLÀÌ ¾Æ´Ï°í ¼ÒÄÏÀÌ ¿¬°á ÁöÇâÇüÀÌ ¾Æ´Ï¶ó¸é, ¸Þ¼¼ÁöÀÇ ¿ø ÁÖ¼Ò°¡ ä¿öÁø´Ù. ÀÎÀÚ fromlen ´Â °ª-°á°ú º¯¼öÀ̸ç from°ú °ü·ÃµÈ ¹öÆÛÀÇ Å©±â·Î ÃʱâÈ­µÇ¸ç ¹Ýȯ½Ã ÀúÀåµÇ´Â ÁÖ¼ÒÀÇ ½ÇÁ¦ Å©±â¸¦ °¡¸®Å°´Â °ªÀ¸·Î ¼öÁ¤µÈ´Ù.

recv È£ÃâÀº º¸Åë connected µÈ ¼ÒÄÏ¿¡¼­¸¸ »ç¿ëµÈ´Ù. ( connect(2)¸¦ ÂüÁ¶Çضó) ±×¸®°í from ÀÎÀÚ¸¦ °¡Áø recvfrom ¿Í µ¿ÀÏÇÏ´Ù.

¼¼ ·çƾ ¸ðµÎ ¼º°øÀûÀÎ ¿Ï¼º½Ã ¸Þ¼¼ÁöÀÇ ±æÀ̸¦ ¹ÝȯÇÑ´Ù. ¸¸ÀÏ ¸Þ¼¼Áö°¡ Á¦°øµÇ´Â ¹öÆÛº¸´Ù ´õ Å©´Ù¸é, ÃÊ°úµÈ ¹ÙÀÌÆ®µéÀº ¸Þ¼¼Áö¸¦ ¹ÞÀº ¼ÒÄÏ Å¸ÀÔ¿¡ ÀÇÁ¸ÇÏ¿© ¹ö·ÁÁø´Ù.( socket(2)¸¦ ÂüÁ¶Çضó).

¸¸ÀÏ ¾î¶² ¸Þ¼¼Áöµéµµ ¼ÒÄÏ¿¡¼­ ÀÌ¿ëÇÒ¼ö ¾ø´Ù¸é, ¹Þ´Â ¼ÒÄÏ È£Ãâ ÇÔ¼öµéÀº ¸¸ÀÏ -1À» ¹ÝȯÇÏ°í ¿ÜºÎ º¯¼ö errno ¸¦ EAGAINÀ¸·Î ¼³Á¤ÇÏ´Â °æ¿ìÀÇ nonblockingÀÌ ¾Æ´Ï¶ó¸é ¸Þ¼¼Áö°¡ µµÂøÇÒ¶§±îÁö ±â´Ù¸°´Ù.( fcntl(2)¸¦ ÂüÁ¶Çضó.) ¸Þ¼¼Áö¸¦ ¹Þ´Â ÇÔ¼öµéÀº º¸Åë ¿ä±¸µÈ ¿ÏÀüÇÑ ¾çÀ» ±â´Ù¸®±â º¸´Ù´Â ¿ä±¸µÈ ¾ç±îÁö ÀÌ¿ëÇÒ¼ö ÀÖ´Â µ¥ÀÌŸ¸¦ ¹ÝȯÇÑ´Ù.

select(2) ³ª poll(2) È£ÃâÀº µ¥ÀÌÅÍ°¡ ´õ µµÂøÇÏ¿´´ÂÁö¸¦ °áÁ¤Çϱâ À§ÇØ »ç¿ëµÈ´Ù.

¹Þ´Â ÇÔ¼öµéÀ» À§ÇÑ flags ÀÎÀÚ´Â ´ÙÀ½ °ªµé Áß ÇϳªÀÌ»óÀÇ OR·Î ±¸¼ºµÈ´Ù.:

MSG_OOB
ÀÌ Ç÷¡±×´Â ÀϹÝÀû µ¥ÀÌÅÍ ½ºÆ®¸²¿¡¼­ ¹ÞÁö ¾Ê´Â out-of-band µ¥ÀÌÅ͸¦ ¿ä±¸ÇÑ´Ù. ¸î¸î ÇÁ·ÎÅäÄÝÀº º¸Åë µ¥ÀÌÅÍ Å¥ÀÇ ¸Ó¸®¿¡ ±ÞÇÑ µ¥ÀÌÅ͸¦ ³õ´Â´Ù. ±×¸®°í ÀÌ Ç÷¡±×´Â ±×·± ÇÁ·ÎÅäÄÝ¿¡¼­´Â »ç¿ëµÉ¼ö ¾ø´Ù.

MSG_PEEK
ÀÌ Ç÷¡±×´Â Å¥¿¡¼­ µ¥ÀÌÅ͸¦ Á¦°ÅÇÏ´Â°Í ¾øÀÌ ¹Þ´Â Å¥ÀÇ ½ÃÀÛ¿¡¼­ µ¥ÀÌÅ͸¦ ¹ÝȯÇϱâ À§ÇÑ ¹Þ±â ÀÛµ¿À» ¾ß±âÇÑ´Ù. ±×¸®°í, ¿¬¼ÓÀûÀÎ ¹Þ±â È£ÃâÀº °°Àº µ¥ÀÌÅ͸¦ ¹ÝȯÇÑ´Ù.

MSG_WAITALL
ÀÌ Ç÷¡±×´Â ¿ÏÀüÇÑ ¿ä±¸°¡ ¸¸Á·µÉ¶§±îÁö ÀÛµ¿À» ºí·°Å·Çϵµ·Ï ¿ä±¸ÇÑ´Ù. ±×·¯³ª, ¸¸ÀÏ ½ÅÈ£°¡ ¹ß»ýÇÏ°í, ¿¡·¯³ª ´ÜÀýÀÌ ¹ß»ýÇϰųª ¹ÞÀº ´ÙÀ½ µ¥ÀÌÅÍ°¡ Àü¿¡ ¹ÝȯµÈ µ¥ÀÌÅÍ¿Í ´Ù¸¥ ŸÀÔÀ̶ó¸é È£ÃâÀº ¿©ÀüÈ÷ ¹ÝȯµÈ´Ù.

MSG_NOSIGNAL
ÀÌ Ç÷¡±×´Â ´Ù¸¥ Á¾Á¡ÀÌ »ç¶óÁ³À»¶§ ½ºÆ®¸² ¼ÒÄÏ¿¡¼­ SIGPIPE °¡ ¹ß»ýÇϴ°ÍÀ» ¸·´Â´Ù(²ö´Ù).
MSG_ERRQUEUE
ÀÌ Ç÷¡±×´Â ¼ÒÄÏ ¿¡·¯ Å¥¿¡¼­ ¹Þ¾Æ¾ßÇÏ´Â ¿¡·¯µéÀ» Å¥Çϵµ·Ï ÁöÁ¤ÇÑ´Ù. ¿¡·¯´Â ÇÁ·ÎÅäÄÝ(IPv4¸¦ À§ÇÑ IP_RECVERR ) ¿¡ ÀÇÁ¸ÇÏ¿© ŸÀÔ°ú º¸Á¶Å×ÀÌÅÍ¿Í ÇÔ²² Àü´ÞµÈ´Ù. »ç¿ëÀÚ´Â ÃæºÐÇÑ Å©±âÀÇ ¹öÆÛ¸¦ Á¦°øÇØ¾ß ÇÑ´Ù.

º¸Á¶ ¸Þ¼¼Áöµé¿¡¼­ ´õ ¸¹Àº Á¤º¸¸¦ ¿øÇϸé 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 *);

ee_errno ´Â Å¥µÈ ¿¡·¯ÀÇ ¿¡·¯ ¹øÈ£¸¦ Æ÷ÇÔÇÑ´Ù. ee_origin ´Â ¿¡·¯°¡ ½ÃÀ۵ƴø ¿ø ÄÚµåÀÌ´Ù. ´Ù¸¥ ÇʵåµéÀº ÇÁ·ÎÅäÄÝ¿¡ ÀÇÁ¸ÇÑ´Ù. ¸ÅÅ©·Î SOCK_EE_OFFENDER ´Â º¸Á¶ ¸Þ¼¼Áö¿¡ ´ëÇÑ ÁÖ¾îÁø Æ÷ÀÎÅÍ¿¡¼­ ¿¡·¯°¡ ¹ß»ýÇÑ ³×Æ®¿÷ °´Ã¼ÀÇ ÁÖ¼Ò¿¡ ´ëÇÑ Æ÷ÀÎÅ͸¦ ¹ÝȯÇÑ´Ù.

¸¸ÀÏ ÀÌ ÁÖ¼Ò°¡ ¾Ë·ÁÁöÁö ¾Ê¾Ò´Ù¸é, sockaddr ÀÇ ¸â¹öÀÎ sa_family ´Â AF_UNSPEC ¸¦ Æ÷ÇÔÇϸç sockaddr ÀÇ ´Ù¸¥ ÇʵåµéÀº Á¤ÀǵÇÁö ¾Ê´Â´Ù. ¿¡·¯¸¦ ¾ß±âÇÑ ÆÐŶÀº º¸Åë µ¥ÀÌÅÍó·³ Àü´ÞµÈ´Ù.

·ÎÄà ¿¡·¯µéÀ» À§ÇØ, ¾î¶² ÁÖ¼Òµµ Àü´ÞµÇÁö ¾Ê´Â´Ù.( ÀÌ°ÍÀº cmsghdrÀÇ cmsg_len ¸â¹ö¿Í ÇÔ²² üũµÈ´Ù.) ¿¡·¯¸¦ ¹Þ±â À§ÇØ, MSG_ERRQUEUE ´Â msghdr¿¡ ¼³Á¤µÈ´Ù.

¿¡·¯°¡ Àü´ÞµÈÈÄ, ¹Ì°áÀÎä·Î ³²¾Æ ÀÖ´ø ¼ÒÄÏ ¿¡·¯µéÀº ´ÙÀ½ Å¥µÈ ¿¡·¯¿¡ ±â¹ÝÇÏ¿© ´Ù½Ã ¸¸µé¾îÁö°í ´ÙÀ½ ¼ÒÄÏ ÀÛµ¿½Ã Àü´ÞµÈ´Ù.

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

¹Ýȯ°ª

À̵é È£ÃâÀº ¹ÞÀº ¹ÙÀÌÆ®µéÀÇ ¼ö¸¦ ¹ÝȯÇÑ´Ù. ¿¡·¯°¡ ¹ß»ýÇϸé -1À» ¹ÝȯÇÑ´Ù.  

¿¡·¯

À̰͵éÀº ¼ÒÄÏ Ãþ¿¡¼­ ¹ß»ýÇÏ´Â ¸î¸î Ç¥ÁØ ¿¡·¯ÀÌ´Ù. Ãß°¡ÀûÀÎ ¿¡·¯µéÀº ÇÁ·ÎÅäÄÝ ¸ðµâµé ¾Æ·¡¿¡¼­ ¹ß»ýµÇ°í ¹ÝȯµÈ´Ù; ÇØ´ç ¸Þ´º¾ó ÆäÀÌÁöµéÀ» ÂüÁ¶Çضó.
EBADF
ÀÎÀÚ s °¡ À¯È¿ÇÑ ±â¼úÀÚ°¡ ¾Æ´Ï´Ù.
ENOTCONN
¼ÒÄÏÀº ¿¬°á ÁöÇâÇü ÇÁ·ÎÅäÄÝÀÌÁö¸¸ ¿¬°áµÇÁö ¾Ê¾Ò´Ù.( connect(2)¿Í accept(2)¸¦ ÂüÁ¶Çضó).
ENOTSOCK
ÀÎÀÚ s °¡ ¼ÒÄÏÀ» °¡¸®Å°Áö ¾Ê´Â´Ù.
EAGAIN
¼ÒÄÏÀÌ non-blockingÀÌ°í ¹Þ´Â ÀÛµ¿Àº ºí·°Å·µÇ¾î Àְųª ¹Þ´Â ŸÀӾƿôÀÌ ¼³Á¤µÇ¾î ÀÖ°í µ¥ÀÌÅ͸¦ ¹Þ±â Àü¿¡ ŸÀӾƿôÀÌ ³¡³µ´Ù.
EINTR
¹Þ±â°¡ µ¥ÀÌÅ͸¦ ÀÌ¿ëÇϱâ Àü¿¡ Àü´ÞµÈ ½ÅÈ£¿¡ ÀÇÇØ ÀÎÅÍ·´Æ® µÇ¾ú´Ù.
EFAULT
¹Þ´Â ¹öÆÛ pointer(s)°¡ ÇÁ·Î¼¼½º ÁÖ¼Ò °ø°£Àܸ̿¦ °¡¸®Å°°í ÀÖ´Ù.
EINVAL
¹«È¿ÇÑ ÀÎÀÚ°¡ Àü´ÞµÇ¾ú´Ù.
 

ȣȯ

4.4BSD (ÀÌ ÇÔ¼ö´Â 4.2BSD¿¡¼­ óÀ½ ³ªÅ¸³µ´Ù.)  

ÁÖÀÇ

À§¿¡ ÁÖ¾îÁø ¿øÇüÀº glibc ÀÌÈÄÀÌ´Ù. Single Unix SpecificationÀº `ssize_t' ŸÀÔÀÇ ¹Ýȯ°ªÀ» °¡Áö´Â °Í¿Ü¿¡ °°´Ù. (¹Ý¸é¿¡ BSD 4.* ±×¸®°í libc4, libc5´Â ¸ðµÎ `int'ÀÌ´Ù.). flags ÀÎÀÚ´Â BSD 4.* ¿¡¼­ `int'ÀÌÁö¸¸, libc4¿Í libc5´Â `unsigned int' ÀÌ´Ù. len ÀÎÀÚ´Â BSD 4.*¿¡¼­ `int'ÀÌÁö¸¸, libc4¿Í libc5´Â 'size_t'ÀÌ´Ù. fromlen ÀÎÀÚ´Â BSD 4.*, libc4, libc5¿¡¼­ `int *'ÀÌ´Ù. ÇöÀç `socklen_t *'´Â POSIX¿¡ ÀÇÇØ ¸¸µé¾îÁ³´Ù. accept(2)¸¦ ÂüÁ¶Çضó.

 

°ü·Ã Ç׸ñ

fcntl(2), read(2), select(2), getsockopt(2), socket(2), cmsg(3)  

¿ªÀÚ

Á¤°­ÈÆ <skyeyes@soback.kornet.net>, 2000³â 12¿ù 11ÀÏ


 

Index

À̸§
»ç¿ë¹ý
¼³¸í
¹Ýȯ°ª
¿¡·¯
ȣȯ
ÁÖÀÇ
°ü·Ã Ç׸ñ
¿ªÀÚ

This document was created by man2html, using the manual pages.
Time: 08:06:59 GMT, March 25, 2004