recv

ëªì¹
     recv, recvfrom, recvmsg — ìì¼ì¼ë¡ë¶í° ë©ì¸ì§ë¥¼ ìì íë¤

íë¡ê·¸ë¨ ë¼ì´ë¸ë¬ë¦¬
     Standard C Library (libc, -lc)

ìì
     <sys/types.h> <sys/socket.h> ssize_t recv(int s, void *buf, size_t len,
     int flags) ssize_t recvfrom(int s, void *buf, size_t len, int flags,
     struct sockaddr *from, socklen_t *fromlen) ssize_t recvmsg(int s, struct
     msghdr *msg, int flags)

í´ì¤
     recvfrom() (ì)ê³¼ recvmsg() (ì)ë, ìì¼ì¼ë¡ë¶í°ì ë©ì¸ì§ë¥¼ ìì íëë°
     ì¬ì©ë©ëë¤.  ìì¼ì´ ì ì ì§í¥ì¸ì§ ì´ë¤ì§ì ê´ê³ìì´, ìì¼ìì ë°ì´í°ë¥¼ ìì íëë°
     ì¬ì©í  ì ììµëë¤.

     from íì§ë§ nil ê° ìëê³ , ìì¼ì´ ì ì ì§í¥ì´ ìë ê²½ì°, ì¬ê¸°ìë ë©ì¸ì§ì ìì¤
     주ìê° ë³´ì¡´ë©ëë¤.  fromlen (ì)ë ãê° - ê²°ê³¼ãíë¼ë¯¸í°ì´ë©°, from ì ëìíë
     ë²í¼ì ì¬ì´ì¦ì ì´ê¸°íëì´ ê·ê°ììë ë³´ì¡´ë 주ìì ì¤ì ì ì¬ì´ì¦ë¥¼
     ëíë´ëë¡(ë¯ì´) ë³ê²½ë©ëë¤.

     recv() í¸ì¶ì, íµì ì ìëìë¤ ìì¼ìììë§ ì¬ì©ëê³  (connect(2) (ì)를 참조),
     from íë¼ë¯¸í°ì nil 를 ì§ì íë¤ recvfrom() (ì)ê³¼ ëì¼í©ëë¤. ì´ê²ì ì¥í©í´ì,
     ì¥ëì 릴리ì¤ììë ìí¬í¸ëì§ ìì ê°ë¥ì±ì´ ììµëë¤.

     ì´ê²ë¤ 3 ê°ì routineë ì ìì ì¼ë¡ ìë£íë¤ê³  ë©ì¸ì§ì 길ì´ë¥¼ ëë ¤ì¤ëë¤.
     ë©ì¸ì§ê° ë무 ê¸¸ì´ ì§ì ì ë²í¼ì ë¤ì´ê°ì§ ìë ê²½ì°, ë©ì¸ì§ë¥¼ ìì í ìì¼ì
     íìì ë°ë¼ìë ì´ê³¼ ë¶ì ë°ì´í¸ê° í기ëë ì¼ì´ ììµëë¤ (socket(2) (ì)를
     참조).

     ìì¼ì ë©ì¸ì§ê° ìë ê²½ì°ë, ìì¼ì´ ë¹ë¸ë¡í¹ (fcntl(2) (ì)를 참조)ì
     ê²½ì°ë¥¼ ì ì¸í´, í¸ì¶ì ë©ì¸ì§ê° ëì°©íë ê²ì 기ë¤ë¦½ëë¤.  ìì¼ì´ ë¹ë¸ë¡í¹ì
     ê²½ì°, ê° -1 ì´ ëë ¤ì£¼ì´ì ¸ ì¸ë¶ ë³ì errno íì§ë§ EAGAIN (ì¼)ë¡
     ì¤ì ë©ëë¤. íµì, ìì  í¸ì¶ì ì구ë ìì ìì í  ëê¹ì§ 기ë¤ë¦¬ì§ ìê³  , ì구ë ìì
     ìíì¼ë¡ì ì»ì ì ìë ë°ì´í°ë¥¼ ëë ¤ì¤ëë¤. ì´ ëìì, getsockopt(2) 그리ê³
     í´ì¤ëê³  ìë ìì¼ ë 벨ì ìµì SO_RCVLOWAT ë° SO_RCVTIMEO ì ìí´ ìí¥ì ë°ìµëë¤.

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

     recv í¸ì¶ìì flags ì¸ìë, ë¤ìì ê°ì 1 ê° ëë ë³µìì ë¼ë¦¬í© (or) (ì¼)ë¡ë¶í°
     ìì±ë©ëë¤.

           MSG_OOB        íë¡ì¸ì¤ ëìì¸ ë°ì´í°
           MSG_PEEK       ì°©ì  ë©ì¸ì§ì ë¤ì¬ë¤ ë³´ê³  (peek)
           MSG_WAITALL    ì구ì ìì í ì¤í, ëë ìë¬ë¥¼ 기ë¤ë¦°ë¤

     MSG_OOB íëê·¸ë ëìì¸ ë°ì´í°ì ìì ì ì구í´, íµìì ë°ì´í° ì¤í¸ë¦¼ì¼ë¡ë¶í°ë
     ìì íì§ ììµëë¤.  ê¸ì¡ ë°ì´í°ë¥¼ íµìì ë°ì´í° 기ë¤ë¦¬ë íë ¬ì ì ëì ë°°ì¹íë
     íë¡í ì½ë ììµëë¤ë§, ì´ íëê·¸ë ê·¸ë¬í íë¡í ì½ììë ì¬ì©í  ì ììµëë¤. MSG_PEEK
     íëê·¸ë ìì  ê¸°ë¤ë¦¬ë íë ¬ì ì ëë¡ë¶í° ë°ì´í°ë¥¼ ì ê±°íë ì¼ ìì´, ê·¸
     ë°ì´í°ë¥¼ ëë ¤ì¤ëë¤. ë°ë¼ì, íìì ìì  í¸ì¶ì ê°ì ë°ì´í° (ì)를 ëë ¤ì¤ëë¤.
     MSG_WAITALL íëê·¸ë ìêµ¬ê° ìì íê² ì±ìì§ ëê¹ì§ ë¸ë¡ íëë¡(ë¯ì´) ì구í©ëë¤.
     ê·¸ë¬ë, ìê·¸ëì´ í¬ì°©ëìì ê²½ì°, ìë¬ ëë ì ë¨ì´ ë°ìíì ê²½ì°, ëë ìì íë ë¤ìì
     ë°ì´í°ê° ëë ¤ì£¼ì´ì§ íìê³¼ ë¤ë¥´ë¤ ê²½ì°, í¸ì¶ì ì구ëìë ê²ë³´ë¤ ì ì
     ë°ì´í°ë¥¼ ëë ¤ì¤ ê°ë¥ì±ì´ ììµëë¤.

     recvmsg() í¸ì¶ì, ì§ì  ì§ì ëë íë¼ë¯¸í°ì ì를 ìµìë¡ í기 ìí´ì(ë문ì) msghdr
     구조체를 ì¬ì©í©ëë¤. ì´ êµ¬ì¡°ì²´ë ⟨sys/socket.h⟩ ê·¸ë¦¬ê³  ì ìëê³
     ìëë¡(ë¯ì´), ë¤ìì íìì´ ëì´ ììµëë¤.

     struct msghdr {
             caddr_t msg_name;       /* 주ì(ìµì) */
             u_int   msg_namelen;    /* 주ìì ì¬ì´ì¦ */
             struct  iovec *msg_iov; /* ì¤ìºí/ê°ë ë°°ì´ */
             u_int   msg_iovlen;     /* msg_iov ì ììì */
             caddr_t msg_control;    /* ë³´ì¡° ë°ì´í°, íì  */
             u_int   msg_controllen; /* ë³´ì¡° ë°ì´í°ì ë²í¼ì¥ */
             int     msg_flags;      /* ìì ë ë©ì¸ì§ìì íëê·¸ */
     };

     ì¬ê¸°ì msg_name (ì)ê³¼ msg_namelen (ì)ë, ìì¼ì´ ì ìëì´ ìì§ ìì ê²½ì°ì,
     íì ì§ ì£¼ì를 ì§ì í©ëë¤.  ì´ë¦ì ì구íì§ ìë ê²½ì°ë íìíì§ ìì ê²½ì°,
     msg_name (ì)ë NULL í¬ì¸í°ë¡ì ì§ì í  ì ììµëë¤.  msg_iov (ì)ê³¼ msg_iovlen
     í read(2) ê·¸ë¦¬ê³  ì¤ëªëê³  ìëë¡(ë¯ì´) ì¤ìºí/ê°ëì ì¥ì를 기ì í©ëë¤.
     msg_control (ì)ë, 길ì´ê° msg_controllen ì, ë¤ë¥¸ íë¡í ì½ ì ì´ì ê´ë ¨íë
     ë©ì¸ì§ ëë ê·¸ ì¸ì ê°ì¢ ë³´ì¡° ë°ì´í°ì©ì ë²í¼ë¥¼ ê°ë¦¬í¤ê³  ììµëë¤.
     ë©ì¸ì§ë ë¤ìì íììëë¤.

     struct cmsghdr {
             u_int   cmsg_len;       /* ë°ì´í° ë°ì´í¸ ì¹´ì´í¸, hdr 를 í¬í¨íë¤ */
             int     cmsg_level;     /* ë©ì¸ì§ë¥¼ ìì±í íë¡í ì½ */
             int     cmsg_type;      /* íë¡í ì½ì ê³ ì ì íì */
     /*      u_char  cmsg_data[]; ê° íì ê³ìëë¤ */
     };

     ì를 ë¤ì´, ì´ê²ì ì¬ì©í´ XNS/SPP ì ëí´ ë°ì´í° ì¤í¸ë¦¼ì ë³í를 ì ìê°
     ììµëë¤. ë, ISO ì ëí´ accept() í¸ì¶ì ì§íì, ë°ì´í° ë²í¼ë¥¼ ìë°íì§ ìê³
     recvmsg 를 ì구í´, ì ì  ì ì ì구 ë°ì´í°ë¥¼ ì»ì ì ìê² ì§ì.

     ì¤íë íì¼ ê¸°ì ìë ì´ê²ì¼ë¡ AF_UNIX ëë©ì¸ ìì¼ì©ì ë³´ì¡° ë°ì´í°ë¡ì ì¸ëí´ì ¸
     ê·¸ ë, cmsg_level íì§ë§ SOL_SOCKET (ì¼)ë¡ ì¤ì ëì´ cmsg_type íì§ë§
     SCM_RIGHTS (ì¼)ë¡ ì¤ì ë©ëë¤.

     SCM_CREDS ì cmsg_type (ì)를 ì¬ì©í´, íë¡ì¸ì¤ì ì¸ì¦ ì 보를 AF_UNIX ëë©ì¸
     ìì¼ì©ì ë³´ì¡° ë°ì´í°ë¡ì ê±´ë¤ì¤ ìë ììµëë¤. ì´ ì¼ì´ì¤ììë, cmsg_data (ì)ë,
     구조체 cmsgcred ì¼ íìê° ììµëë¤. ì´ê²ì ë¤ìê³¼ ê°ì´ ⟨sys/socket.h⟩ ììì
     ì ìëê³  ììµëë¤.

     struct cmsgcred {
             pid_t   cmcred_pid;             /* ì¡ì  íë¡ì¸ì¤ì PID */
             uid_t   cmcred_uid;             /* ì¡ì  íë¡ì¸ì¤ì ì´ë§¤ UID */
             uid_t   cmcred_euid;            /* ì¡ì  íë¡ì¸ì¤ì ì¤í¨ UID */
             gid_t   cmcred_gid;             /* ì¡ì  íë¡ì¸ì¤ì ì´ë§¤ GID */
             short   cmcred_ngroups;         /* 그룹ì ì */
             gid_t   cmcred_groups[CMGROUP_MAX];     /* 그룹 */
     };

     커ëì ì¡ì  íë¡ì¸ì¤ì ì¸ì¦ ì 보를 기ìí´, ê·¸ê²ì ìì 측ì ì ë¬í©ëë¤.

     msg_flags íëë ìì ì´ ëë ë©ì¸ì§ì ë°ë¼ ê·ê°ìë¡ ì¤ì ë©ëë¤.  MSG_EOR (ì)ë end-
     of-record, ì¦ ëë ¤ì£¼ì´ì§ ë°ì´í°ë¡ ë ì½ëê° ìê²°íê³  ìë ê²ì ëíëëë¤
     (ì¼ë°ì ì¼ë¡ë, íì SOCK_SEQPACKET ì ìì¼ê³¼ í¨ê» ì¬ì©ë©ëë¤).  MSG_TRUNC
     (ì)ë, ì ê³µë ë²í¼ë³´ë¤ ë°ì´í° ê·¸ë¨ì´ 컸기 ë문ì, ë°ì´í° ê·¸ë¨ì ë¤ì
     ë¶ë¶ì ìë¼ ë²ë¦´ ì ìë ê²ì ëíëëë¤.  MSG_CTRUNC (ì)ë, ë³´ì¡° ë°ì´í°ì©ì
     ë²í¼ë´ì ê³µê°ì ë¶ì¡±ì ìí´ì(ë문ì) ì¼ë§ì¸ê°ì ì ì´ ë°ì´í°ê° ìë¼ ë²ë¦´ ì ìë
     ê²ì ëíëëë¤.  MSG_OOB (ì)ë, ê¸ì¡ ëë ëìì¸ ë°ì´í°ê° ìì ë ê²ì ëíëëë¤.

ë°íê°
     ì´ë¬í í¸ì¶ì ìì í ë°ì´í¸ì를 ëë ¤ì£¼ì´, ìë¬ê° ì¼ì´ë¬ì ê²½ì°ë -1 ì
     ëë ¤ì¤ëë¤.

ìë¬
     í¸ì¶ì ë¤ìì ê²½ì°ì ì¤í¨í©ëë¤.

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

     [ENOTCONN]         ìì¼ì ì ì ì§í¥ íë¡í ì½ê³¼ ì°ê²°ìí¬ ì ìê³  ììµëë¤ë§,
                        ì ìëê³  ìì§ ììµëë¤ (connect(2) (ì)ê³¼ accept(2) (ì)를
                        참조).

     [ENOTSOCK]         ì¸ì s (ì)ë ìì¼ì 참조íê³  ìì§ ììµëë¤.

     [EAGAIN]           ìì¼ì´ ë¹ë¸ë¡í¹ê³¼ ë§í¬ ëê³  ìì ë, ìì  ì¡°ìì¼ë¡ ë¸ë¡
                        íìµëë¤.  í¹ì, ìì  íì ììì´ ì¤ì ëì´ ìì´, ë°ì´í°ê°
                        ìì ë기 ì ì íì ììì´ ëììµëë¤.

     [EINTR]            ë°ì´í°ê° ìì  ê°ë¥íê² ë기 ì ì, ìì ì´ ìê·¸ëì ìí´ ë¹ì¨
                        ë¶ë¹ì´ì¡ìµëë¤.

     [EFAULT]           ìì  ë²í¼ í¬ì¸í°ê°, íë¡ì¸ì¤ì í ë¹í  ì ììë address
                        ê³µê°ì ë²ìì¸ë¥¼ ê°ë¦¬í¤ê³  ììµëë¤.

ê´ë ¨ í목
     fcntl(2), getsockopt(2), read(2), select(2), socket(2)

ìì¬
     recv() í¨ìë 4.2BSD ê·¸ë¦¬ê³  ë±ì¥íìµëë¤.