recv

RECV(2)                    리ëì¤ íë¡ê·¸ë머 매ë´ì¼                   RECV(2)



ì´ë¦
       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 í¸ì¶ì ë³´íµ ì°ê²°ë ìì¼ììë§ ì¬ì©ëë¤.  ( connect(2)를 참조íë¼)
       ê·¸ë¦¬ê³  from ì¸ì를 ê°ì§ recvfromê³¼ ëì¼íë¤.

       ìì¼ì ë©ìì§ê° ìë¤ë©´, ë©ìì§ë¥¼ ë°ë í¸ì¶ì ë©ìì§ê° ë¤ì´ì¬ëê¹ì§
       기ë¤ë¦¬ê²ëë©°, ë§ì½ ìì¼ì´ ëë¸ëí¹( fcntl(2) 참조)ì´ìë¤ë©´ ê²°ê³¼ê°ì
       -1ì´ ëê³  errno를 EAGAINì¼ë¡ ì¤ì íë¤.  ì¼ë°ì ì¼ë¡ ë©ìì§ë¥¼ ë°ë í¸ì¶ë¤ì
       ì구ë ìì 모ë ì±ì°ë©° 기ë¤ë¦¬ê¸° ë³´ë¤ë ì±ìì§ ìì 리í´íë¤.

       select(2) ë poll(2) í¸ì¶ì ë°ì´í°ê° ë ëì°©íìëì§ë¥¼ ê²°ì í기 ìí´
       ì¬ì©ëë¤.

       ë°ë í¨ìë¤ì ìí flags ì¸ìë ë¤ì ê°ë¤ ì¤ íë ì´ìì ORë¡ êµ¬ì±ëë¤.:

       MSG_OOB
              ì´ íëê·¸ë ì¼ë°ì  ë°ì´í° ì¤í¸ë¦¼ìì ë°ì§ ìë out-of-band ë°ì´í°ë¥¼
              ì구íë¤.  ëªëª íë¡í ì½ì ë³´íµ ë°ì´í° íì 머리ì ê¸í ë°ì´í°ë¥¼
              ëëë¤. ê·¸ë¦¬ê³  ì´ íëê·¸ë ê·¸ë° íë¡í ì½ììë ì¬ì©ë  ì ìë¤.

       MSG_PEEK
              ì´ íëê·¸ë íìì ë°ì´í°ë¥¼ ì ê±°íì§ ìê³  ë°ë íì ììììë¶í° ë°ì´í°ë¥¼
              ë°ííë ë°ê¸° ìëì íëë¡ íë¤.  ê·¸ëì, ì°ìì ì¸ ë°ê¸° í¸ì¶ì ê°ì
              ë°ì´í°ë¥¼ ë°ííë¤.

       MSG_WAITALL
              ì´ íëê·¸ë ì구í ìì´ ë¤ ì°° ëê¹ì§ ìëì ë¸ëí¹íëë¡ ì구íë¤.  ê·¸ë¬ë,
              ë§ì¼ ì í¸ê° ë°ìíê±°ë, ì¤ë¥ë ë¨ì ì´ ë°ìíê±°ë, í¹ì ë°ì ë°ì´í°ê°
              ì ì ë°íë ë°ì´í°ì ë¤ë¥¸ íìì´ë¼ë©´ ì구í ê²ë³´ë¤ ì ì ë°ì´í°ë¼ë
              ë°ííë¤.

       MSG_TRUNC
              ì ë¬ë ë²í¼ì 길ì´ë³´ë¤ 길ëë¼ë í¨í·ì ì¤ì  길ì´ë¥¼ ë°ííë¤.  í¨í·
              ìì¼ììë§ ì í¨íë¤.

       MSG_ERRQUEUE
              ì´ íëê·¸ë ìì¼ ì¤ë¥ íì ì ì¥ë ì¤ë¥ë¤ì ë°ëë¡ íë¤.  ì¤ë¥ë
              íë¡í ì½(IPv4 IP_RECVERR를 ìí)ì ìì¡´íë íìì ê°ë ë³´ì¡° ë©ìì§ë¡
              ì ë¬ëë¤.  ì¬ì©ìë 충ë¶í í¬ê¸°ì ë²í¼ë¥¼ ì ê³µí´ì¼ íë¤. ì¢ë ìì¸í
              ì ë³´ë cmsg(3)ê³¼ ip(7)ì ì°¸ê³ íë¼.

              ì¤ë¥ë¥¼ ë°ììí¨ ìë í¨í·ì ì í¨ ë°ì´í°(payload)ë msg_iovec를 íµí´
              ë³´íµ ë°ì´í°ë¡ ì ë¬ëë¤.  ì¤ë¥ë¥¼ ë°ììí¨ ë°ì´í°ê·¸ë¨ì ìë ëì°©
              주ìë msg_nameì íµí´ ì ê³µëë¤.

              ë¡ì»¬ ì¤ë¥ì ëí´ìë ìë¬´ë° ì£¼ìë ì ë¬ëì§ ìëë¤.  (ì´ê²ì cmsghdrì
              멤ë²ì¸ cmsg_lenì¼ë¡ íì¸í  ì ìë¤.)  ì¤ë¥ê° ë°ìíë©´,
              MSG_ERRQUEUEê° msghdrì ì¤ì ëë¤.  íëì ìë¬ê° ì ë¬ë í, ê³ë¥ ì¤ì¸
              ìì¼ ì¤ë¥ë ë¤ì ì ì¥ë ì¤ë¥ë¥¼ 기ë°ì¼ë¡ ë¤ì ë§ë¤ì´ì§ë¤.
              ê·¸ë¦¬ê³ , ì´ê²ì ë¤ì ìì¼ ì°ì°ì¼ë¡ ì ë¬ë  ê²ì´ë¤.  ì¤ë¥ë
              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 *SO_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 ìì¹ë¥¼ ê°ë¦¬í¨ë¤.
       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ë ì´ë¤ ë°ì´í°ë
       ë°ì§ ììì§ë§ ìì¼ ì¤ë¥ íìì ì¤ë¥ê° íì¥ëìë¤ë ê²ì ëíë¸ë¤.

ë°íê°
       ì´ë¤ í¸ì¶ì ë°ì ë°ì´í¸ë¤ì ì를 ë°ííë¤. ì¤ë¥ê° ë°ìíë©´ -1ì ë°ííë¤.

ì¤ë¥
       ì´ê²ë¤ì ìì¼ ì¸µìì ë°ìíë ëªëª íì¤ ì¤ë¥ì´ë¤. ì¶ê°ì ì¸ ì¤ë¥ë¤ì íë¡í ì½
       모ëë¤ ìëìì ë°ìëê³  ë°íëë¤; í´ë¹ ë©ë´ì¼ íì´ì§ë¤ì 참조íë¼.

       EBADF  ì¸ì sê° ì í¨í 기ì ìê° ìëë¤.

       ENOTCONN
              ìì¼ì ì°ê²° ì§í¥í íë¡í ì½ì´ì§ë§ ì°ê²°ëì§ ììë¤. ( connect(2)ì
              accept(2)를 참조íë¼.)

       ENOTSOCK
              ì¸ì sê° ìì¼ì ê°ë¦¬í¤ì§ ìëë¤.

       EAGAIN ìì¼ì´ non-blockingì´ê³  ë°ë ìëì ë¸ëí¹ëì´ ìê±°ë ë°ë íìììì´
              ì¤ì ëì´ ìê³  ë°ì´í°ë¥¼ ë°ê¸° ì ì íìììì´ ëë¬ë¤.

       EINTR  ë°ê¸°ê° ë°ì´í°ë¥¼ ì´ì©í기 ì ì ì ë¬ë ì í¸ì ìí´ ì¸í°ë½í¸ ëìë¤.

       EFAULT ë°ë ë²í¼ í¬ì¸í°ê° íë¡ì¸ì¤ 주ì ê³µê° ì´ì¸ë¥¼ ê°ë¦¬í¤ê³  ìë¤.

       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ì¼
       íê¸ Manpage íë¡ì í¸ (http://man.kldp.org) 2004ë 3ì 25ì¼



리ëì¤ ë©ë´ì¼ íì´ì§               2002-12-31                           RECV(2)