recv(2) - wariua/manpages-ko GitHub Wiki

NAME

recv, recvfrom, recvmsg - μ†ŒμΌ“μ—μ„œ λ©”μ‹œμ§€ λ°›κΈ°

SYNOPSIS

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

ssize_t recv(int sockfd, void *buf, size_t len, int flags);

ssize_t recvfrom(int sockfd, void *buf, size_t len, int flags,
                 struct sockaddr *src_addr, socklen_t *addrlen);

ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags);

DESCRIPTION

recv(), recvfrom(), recvmsg() ν˜ΈμΆœμ„ μ΄μš©ν•΄ μ†ŒμΌ“μ—μ„œ λ©”μ‹œμ§€λ₯Ό λ°›λŠ”λ‹€. 무연결 μ†ŒμΌ“κ³Ό μ—°κ²° μ§€ν–₯ μ†ŒμΌ“ λͺ¨λ‘μ—μ„œ 데이터λ₯Ό 받을 수 μžˆλ‹€. 이 νŽ˜μ΄μ§€μ—μ„œλŠ” λ¨Όμ € μ„Έ κ°€μ§€ μ‹œμŠ€ν…œ 호좜의 곡톡 κΈ°λŠ₯을 κΈ°μˆ ν•œ λ‹€μŒ ν˜ΈμΆœλ“€ κ°„μ˜ 차이점을 κΈ°μˆ ν•œλ‹€.

recv()와 read(2)의 μœ μΌν•œ μ°¨μ΄λŠ” flags의 쑴재 μ—¬λΆ€λ‹€. flags μΈμžκ°€ 0이면 recv()λŠ” 일반적으둜 read(2)와 λ™λ“±ν•˜λ‹€. (ν•˜μ§€λ§Œ NOTES μ°Έκ³ .) λ˜ν•œ λ‹€μŒ ν˜ΈμΆœμ€

recv(sockfd, buf, len, flags);

λ‹€μŒκ³Ό λ™λ“±ν•˜λ‹€.

recvfrom(sockfd, buf, len, flags, NULL, NULL);

μ„Έ 호좜 λͺ¨λ‘ 성곡 μ™„λ£Œ μ‹œ λ©”μ‹œμ§€ 길이λ₯Ό λ°˜ν™˜ν•œλ‹€. λ©”μ‹œμ§€κ°€ λ„ˆλ¬΄ κΈΈμ–΄μ„œ 제곡 버퍼에 λ“€μ–΄κ°€μ§€ μ•ŠλŠ” 경우 λ©”μ‹œμ§€λ₯Ό λ°›λŠ” μ†ŒμΌ“μ˜ μ’…λ₯˜μ— 따라선 λ„˜μΉ˜λŠ” λ°”μ΄νŠΈλ“€μ„ 버릴 μˆ˜λ„ μžˆλ‹€.

μˆ˜μ‹  ν˜ΈμΆœλ“€μ€ μ†ŒμΌ“μ— λ©”μ‹œμ§€κ°€ μ—†μœΌλ©΄ λ©”μ‹œμ§€κ°€ λ„μ°©ν•˜κΈ°λ₯Ό κΈ°λ‹€λ¦°λ‹€. 단 μ†ŒμΌ“μ΄ λ…ΌλΈ”λ‘œν‚Ήμ΄λ©΄ (fcntl(2) μ°Έκ³ ) -1 값을 λ°˜ν™˜ν•˜κ³  μ™ΈλΆ€ λ³€μˆ˜ errnoλ₯Ό EAGAINμ΄λ‚˜ EWOULDBLOCK으둜 μ„€μ •ν•œλ‹€. μˆ˜μ‹  ν˜ΈμΆœλ“€μ€ 보톡 μš”μ²­ 받은 μ–‘ 전체λ₯Ό μˆ˜μ‹ ν•  λ•ŒκΉŒμ§€ κΈ°λ‹€λ¦¬κΈ°λ³΄λ‹€λŠ” μ‚¬μš© κ°€λŠ₯ν•œ 데이터λ₯Ό μ΅œλŒ€ μš”μ²­ 크기만큼 λ°”λ‘œ λ°˜ν™˜ν•œλ‹€.

μ‘μš©μ—μ„œ select(2), poll(2), epoll(7)을 μ΄μš©ν•΄ μ†ŒμΌ“μ— 데이터가 더 λ„μ°©ν–ˆλŠ”μ§€ μ•Œμ•„λ‚Ό 수 μžˆλ‹€.

flags 인자

flags μΈμžλŠ” λ‹€μŒ 값듀을 1개 이상 OR ν•΄μ„œ κ΅¬μ„±ν•œλ‹€.

MSG_CMSG_CLOEXEC (recvmsg() μ „μš©, λ¦¬λˆ…μŠ€ 2.6.23λΆ€ν„°)
(unix(7)μ—μ„œ κΈ°μˆ ν•˜λŠ”) SCM_RIGHTS λ™μž‘μœΌλ‘œ μœ λ‹‰μŠ€ 도메인 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό 톡해 μˆ˜μ‹ ν•˜λŠ” 파일 λ””μŠ€ν¬λ¦½ν„°μ— 'execμ—μ„œ λ‹«κΈ°' ν”Œλž˜κ·Έλ₯Ό μ„€μ •ν•œλ‹€. open(2)의 O_CLOEXEC ν”Œλž˜κ·Έμ™€ 같은 이유둜 이 ν”Œλž˜κ·Έκ°€ μœ μš©ν•˜λ‹€.
MSG_DONTWAIT (λ¦¬λˆ…μŠ€ 2.2λΆ€ν„°)
λ…ΌλΈ”λ‘œν‚Ή λ™μž‘μ„ μΌ λ‹€. λ™μž‘μ΄ 블둝 λ˜λ €λŠ” 경우 호좜이 EAGAINμ΄λ‚˜ EWOULDBLOCK으둜 μ‹€νŒ¨ν•œλ‹€. (fcntl(2) F_SETFL λ™μž‘μ„ 톡해) O_NONBLOCK ν”Œλž˜κ·Έλ₯Ό μ„€μ •ν•œ κ²½μš°μ™€ λΉ„μŠ·ν•œ λ™μž‘ 방식인데, MSG_DONTWAIT이 ν˜ΈμΆœλ³„ μ˜΅μ…˜μΈ 반면 O_NONBLOCK은 μ—΄λ¦° 파일 기술 ν•­λͺ©μ— λŒ€ν•œ μ„€μ •μ΄μ–΄μ„œ (open(2) μ°Έκ³ ) 호좜 ν”„λ‘œμ„ΈμŠ€ λ‚΄ λͺ¨λ“  μŠ€λ ˆλ“œλΏ μ•„λ‹ˆλΌ 같은 μ—΄λ¦° 파일 기술 ν•­λͺ©μ„ κ°€λ¦¬ν‚€λŠ” 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό κ°€μ§„ λ‹€λ₯Έ ν”„λ‘œμ„ΈμŠ€μ—λ„ 영ν–₯을 끼치게 λœλ‹€.
MSG_ERRQUEUE (λ¦¬λˆ…μŠ€ 2.2λΆ€ν„°)

이 ν”Œλž˜κ·ΈλŠ” μ†ŒμΌ“ 였λ₯˜ 큐에 μžˆλŠ” 였λ₯˜λ₯Ό 받아와야 함을 λ‚˜νƒ€λ‚Έλ‹€. 보쑰 λ©”μ‹œμ§€λ‘œ 였λ₯˜κ°€ μ „λ‹¬λ˜λ©° κ·Έ νƒ€μž…μ€ ν”„λ‘œν† μ½œμ— 따라 λ‹€λ₯΄λ‹€. (IPv4μ—μ„œλŠ” IP_RECVERR.) μ‚¬μš©μžκ°€ μΆ©λΆ„ν•œ 크기의 버퍼λ₯Ό μ œκ³΅ν•΄μ•Ό ν•œλ‹€. μžμ„Έν•œ λ‚΄μš©μ€ cmsg(3)와 ip(7)λ₯Ό 보라. 였λ₯˜λ₯Ό μœ λ°œν•œ 원인 νŒ¨ν‚·μ˜ νŽ˜μ΄λ‘œλ“œκ°€ msg_iovec을 톡해 정상 λ°μ΄ν„°μ²˜λŸΌ μ „λ‹¬λœλ‹€. 였λ₯˜λ₯Ό μœ λ°œν•œ λ°μ΄ν„°κ·Έλž¨μ˜ μ›λž˜ λͺ©μ  μ£Όμ†Œκ°€ msg_name으둜 μ œκ³΅λœλ‹€.

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
{
    uint32_t ee_errno;   /* 였λ₯˜ 번호 */
    uint8_t  ee_origin;  /* 였λ₯˜κ°€ μ–΄λ””μ„œ μ™”λŠ”κ°€ */
    uint8_t  ee_type;    /* νƒ€μž… */
    uint8_t  ee_code;    /* μ½”λ“œ */
    uint8_t  ee_pad;     /* νŒ¨λ”© */
    uint32_t ee_info;    /* μΆ”κ°€ 정보 */
    uint32_t ee_data;    /* 기타 데이터 */
    /* 데이터가 더 올 수 있음 */
};

struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *);

ee_errnoλŠ” 큐에 μžˆλŠ” 였λ₯˜μ˜ errno 번호λ₯Ό λ‹΄λŠ”λ‹€. err_origin은 였λ₯˜κ°€ λ°œμƒν•œ 곳을 λ‚˜νƒ€λ‚΄λŠ” μ½”λ“œμ΄λ‹€. λ‚˜λ¨Έμ§€λŠ” ν”„λ‘œν† μ½œλ³„ ν•„λ“œμ΄λ‹€. 맀크둜 SOCK_EE_OFFENDERλŠ” 보쑰 λ©”μ‹œμ§€μ— λŒ€ν•œ 포인터λ₯Ό λ°›μ•„μ„œ 였λ₯˜μ˜ 근원이 된 λ„€νŠΈμ›Œν¬ 객체의 μ£Όμ†Œμ— λŒ€ν•œ 포인터λ₯Ό λ°˜ν™˜ν•œλ‹€. κ·Έ μ£Όμ†Œλ₯Ό μ•Œμ§€ λͺ»ν•˜λ©΄ sockaddr의 sa_familyκ°€ AF_UNSPEC을 λ‹΄μœΌλ©° sockaddr의 λ‚˜λ¨Έμ§€ ν•„λ“œλ“€μ΄ μ •μ˜λΌ μžˆμ§€ μ•Šλ‹€. 였λ₯˜λ₯Ό μœ λ°œν•œ νŒ¨ν‚·μ˜ νŽ˜μ΄λ‘œλ“œλŠ” 정상 λ°μ΄ν„°μ²˜λŸΌ μ „λ‹¬λœλ‹€.

둜컬 였λ₯˜μΈ 경우 μ£Όμ†Œκ°€ μ „λ‹¬λ˜μ§€ μ•ŠλŠ”λ‹€. (cmsghdr의 cmsg_len λ©€λ²„λ‘œ 확인할 수 μžˆλ‹€.) 였λ₯˜ μˆ˜μ‹ μ—μ„œλŠ” msghdr에 MSG_ERRQUEUE ν”Œλž˜κ·Έκ°€ 섀정돼 μžˆλ‹€. 였λ₯˜κ°€ μ „λ‹¬λœ ν›„μ—λŠ” 큐에 μžˆλŠ” λ‹€μŒ 였λ₯˜μ— κΈ°λ°˜ν•΄μ„œ 미처리 μ†ŒμΌ“ 였λ₯˜κ°€ μž¬μƒμ„±λ˜μ–΄ λ‹€μŒ μ†ŒμΌ“ λ™μž‘μœΌλ‘œ μ „λ‹¬λœλ‹€.

MSG_OOB
이 ν”Œλž˜κ·ΈλŠ” 정상 데이터 μŠ€νŠΈλ¦ΌμœΌλ‘œλŠ” λ°›κ²Œ λ˜μ§€ μ•Šμ„ λŒ€μ—­μ™Έ 데이터 μˆ˜μ‹ μ„ μš”μ²­ν•œλ‹€. μ–΄λ–€ ν”„λ‘œν† μ½œμ—μ„œλŠ” κΈ΄κΈ‰ 데이터λ₯Ό 정상 데이터 큐 선두에 μ§‘μ–΄λ„£μœΌλ©°, κ·Έλž˜μ„œ 그런 ν”„λ‘œν† μ½œμ—μ„œλŠ” 이 ν”Œλž˜κ·Έλ₯Ό μ‚¬μš©ν•  수 μ—†λ‹€.
MSG_PEEK
이 ν”Œλž˜κ·ΈλŠ” μˆ˜μ‹  λ™μž‘μ΄ μˆ˜μ‹  큐 처음의 데이터λ₯Ό λ°˜ν™˜ν•˜λ˜ νμ—μ„œ κ·Έ 데이터λ₯Ό μ œκ±°ν•˜μ§€ μ•Šκ²Œ ν•œλ‹€. λ”°λΌμ„œ μ΄μ–΄μ§€λŠ” μˆ˜μ‹  호좜이 같은 데이터λ₯Ό λ°˜ν™˜ν•˜κ²Œ λœλ‹€.
MSG_TRUNC (λ¦¬λˆ…μŠ€ 2.2λΆ€ν„°)

둜우 (AF_PACKET), 인터넷 λ°μ΄ν„°κ·Έλž¨ (λ¦¬λˆ…μŠ€ 2.4.27/2.6.8λΆ€ν„°), 넷링크 (λ¦¬λˆ…μŠ€ 2.6.22λΆ€ν„°), μœ λ‹‰μŠ€ λ°μ΄ν„°κ·Έλž¨ (λ¦¬λˆ…μŠ€ 3.4λΆ€ν„°) μ†ŒμΌ“μ—μ„œ: νŒ¨ν‚· λ‚΄μ§€ λ°μ΄ν„°κ·Έλž¨μ˜ μ‹€μ œ 길이가 μ „λ‹¬ν•œ 버퍼보닀 컸던 κ²½μš°μ—λ„ κ·Έ μ‹€μ œ 길이λ₯Ό λ°˜ν™˜ν•œλ‹€.

인터넷 슀트림 ν”„λ‘œν† μ½œμ—μ„œμ˜ μ‚¬μš©μ— λŒ€ν•΄μ„  tcp(7) μ°Έκ³ .

MSG_WAITALL (λ¦¬λˆ…μŠ€ 2.2λΆ€ν„°)
이 ν”Œλž˜κ·ΈλŠ” μš”μ²­ 전체가 좩쑱될 λ•ŒκΉŒμ§€ λ™μž‘μ΄ λΈ”λ‘ν•˜κΈ°λ₯Ό μš”μ²­ν•œλ‹€. ν•˜μ§€λ§Œ μ‹œκ·Έλ„μ„ μž‘κ±°λ‚˜, 였λ₯˜ λ‚΄μ§€ μ—°κ²° λŠκΉ€μ΄ λ°œμƒν•˜κ±°λ‚˜, λ‹€μŒ μˆ˜μ‹  데이터가 λ‹€λ₯Έ νƒ€μž…μΈ κ²½μš°μ—λŠ” μ—¬μ „νžˆ μš”μ²­λ³΄λ‹€ 적은 데이터λ₯Ό λ°˜ν™˜ν•  수 μžˆλ‹€. λ°μ΄ν„°κ·Έλž¨ μ†ŒμΌ“μ—λŠ” 이 ν”Œλž˜κ·Έκ°€ νš¨κ³Όκ°€ μ—†λ‹€.

recvfrom()

recvfrom()은 μˆ˜μ‹ ν•œ λ©”μ‹œμ§€λ₯Ό 버퍼 buf에 μ§‘μ–΄λ„£λŠ”λ‹€. λ²„νΌμ˜ 크기λ₯Ό ν˜ΈμΆœμžκ°€ len에 μ§€μ •ν•΄μ•Ό ν•œλ‹€.

src_addr이 NULL이 μ•„λ‹ˆλ©° 기반 ν”„λ‘œλ‘œμ½œμ—μ„œ λ©”μ‹œμ§€μ˜ 좜발 μ£Όμ†Œλ₯Ό μ œκ³΅ν•˜λŠ” 경우 κ·Έ 좜발 μ£Όμ†Œλ₯Ό src_addr이 κ°€λ¦¬ν‚€λŠ” 버퍼에 μ§‘μ–΄λ„£λŠ”λ‹€. 이 κ²½μš°μ— addrlen은 κ°’μ΄μž 결과인 μΈμžμ΄λ‹€. 호좜 μ „μ—λŠ” src_addr에 μ—°κ³„λœ λ²„νΌμ˜ 크기둜 μ΄ˆκΈ°ν™” ν•΄μ•Ό ν•œλ‹€. 그리고 λ°˜ν™˜ μ‹œ 좜발 μ£Όμ†Œμ˜ μ‹€μ œ 크기λ₯Ό 담도둝 addrlen이 κ°±μ‹ λœλ‹€. 제곡 버퍼가 λ„ˆλ¬΄ μž‘μœΌλ©΄ λ°˜ν™˜ μ£Όμ†Œκ°€ μž˜λ¦¬λŠ”λ°, 이 경우 addrlen이 ν˜ΈμΆœμ— 쀬던 것보닀 큰 값을 λ°˜ν™˜ν•˜κ²Œ λœλ‹€.

ν˜ΈμΆœμžκ°€ 좜발 μ£Όμ†Œμ— 관심이 μ—†μœΌλ©΄ src_addrκ³Ό addrlen을 NULL둜 μ§€μ •ν•΄μ•Ό ν•œλ‹€.

recv()

recv() ν˜ΈμΆœμ€ 보톡 μ—°κ²° μƒνƒœμΈ (connect(2) μ°Έκ³ ) μ†ŒμΌ“μ—μ„œλ§Œ μ“΄λ‹€. λ‹€μŒ 호좜과 λ™λ“±ν•˜λ‹€.

recvfrom(fd, buf, len, flags, NULL, 0);

recvmsg()

recvmsg() ν˜ΈμΆœμ—μ„œλŠ” msghdr ꡬ쑰체λ₯Ό μ‚¬μš©ν•΄ 직접 μ œκ³΅ν•˜λŠ” μΈμžλ“€μ˜ 수λ₯Ό 쀄인닀. 이 κ΅¬μ‘°μ²΄λŠ” <sys/socket.h>에 λ‹€μŒκ³Ό 같이 μ •μ˜λ˜μ–΄ μžˆλ‹€.

struct iovec {                    /* μŠ€μΊν„°/κ°œλ” λ°°μ—΄ ν•­λͺ© */
    void  *iov_base;              /* μ‹œμž‘ μ£Όμ†Œ */
    size_t iov_len;               /* 이동할 λ°”μ΄νŠΈ 수 */
};

struct msghdr {
    void         *msg_name;       /* μ£Όμ†Œ, 선택적 */
    socklen_t     msg_namelen;    /* μ£Όμ†Œ 크기 */
    struct iovec *msg_iov;        /* μŠ€μΊν„°/κ°œλ” λ°°μ—΄ */
    size_t        msg_iovlen;     /* msg_iov의 ν•­λͺ© 개수 */
    void         *msg_control;    /* 보쑰 데이터, μ•„λž˜ μ°Έκ³  */
    size_t        msg_controllen; /* 보쑰 데이터 버퍼 길이 */
    int           msg_flags;      /* μˆ˜μ‹  λ©”μ‹œμ§€μ— λŒ€ν•œ ν”Œλž˜κ·Έ */
};

msg_name ν•„λ“œλŠ” 호좜자 ν• λ‹Ή 버퍼λ₯Ό 가리킀며 μ†ŒμΌ“μ΄ 연결돼 μžˆμ§€ μ•Šμ€ 경우 좜발 μ£Όμ†Œλ₯Ό λ°˜ν™˜ν•˜λŠ” 데 이 버퍼λ₯Ό μ“΄λ‹€. 호좜 전에 ν˜ΈμΆœμžκ°€ msg_namelen에 버퍼 크기λ₯Ό μ„€μ •ν•΄μ•Ό ν•˜λ©° 성곡 호좜 λ°˜ν™˜ μ‹œ msg_namelen이 λ°˜ν™˜ μ£Όμ†Œμ˜ 길이λ₯Ό λ‹΄κ²Œ λœλ‹€. μ‘μš©μ—μ„œ 좜발 μ£Όμ†Œλ₯Ό μ•Œ ν•„μš”κ°€ μ—†μœΌλ©΄ msg_name을 NULL둜 μ§€μ •ν•˜λ©΄ λœλ‹€.

msg_iov 및 msg_iovlen ν•„λ“œλŠ” readv(2)μ—μ„œμ²˜λŸΌ μŠ€μΊν„°-κ°œλ” μœ„μΉ˜λ“€μ„ κΈ°μˆ ν•œλ‹€.

msg_control ν•„λ“œλŠ” 여타 ν”„λ‘œν† μ½œ μ œμ–΄ κ΄€λ ¨ λ©”μ‹œμ§€λ‚˜ μ—¬λŸ¬ 보쑰 데이터λ₯Ό μœ„ν•œ msg_controllen 길이의 버퍼λ₯Ό 가리킨닀. recvmsg() 호좜 μ‹œ msg_controllen이 msg_control의 κ°€μš© 버퍼 길이λ₯Ό λ‹΄κ³  μžˆμ–΄μ•Ό ν•œλ‹€. 성곡 호좜 λ°˜ν™˜ μ‹œ μ œμ–΄ λ©”μ‹œμ§€ μ—΄μ˜ 길이λ₯Ό λ‹΄κ²Œ λœλ‹€.

λ©”μ‹œμ§€λŠ” λ‹€μŒ ν˜•νƒœμ΄λ‹€.

struct cmsghdr {
    size_t cmsg_len;    /* 데이터 λ°”μ΄νŠΈ 개수. 헀더 포함.
                           (POSIXμ—μ„œλŠ” νƒ€μž…μ΄ socklen_t) */
    int    cmsg_level;  /* 기원 ν”„λ‘œν† μ½œ */
    int    cmsg_type;   /* ν”„λ‘œν† μ½œλ³„ νƒ€μž… */
/* μ΄μ–΄μ„œ:
    unsigned char cmsg_data[]; */
};

보쑰 λ°μ΄ν„°λŠ” cmsg(3)에 μ •μ˜λœ 맀크둜λ₯Ό ν†΅ν•΄μ„œλ§Œ μ ‘κ·Όν•΄μ•Ό ν•œλ‹€.

예λ₯Ό λ“€μ–΄ λ¦¬λˆ…μŠ€μ—μ„œλŠ” 이 보쑰 데이터 λ©”μ»€λ‹ˆμ¦˜μ„ μ΄μš©ν•΄ ν™•μž₯ 였λ₯˜λ‚˜ IP μ˜΅μ…˜μ„, 그리고 μœ λ‹‰μŠ€ 도메인 μ†ŒμΌ“ μƒμœΌλ‘œ 파일 λ””μŠ€ν¬λ¦½ν„°λ₯Ό μ „λ‹¬ν•œλ‹€.

recvmsg() λ°˜ν™˜ μ‹œ msghdr의 msg_flags ν•„λ“œκ°€ μ„€μ •λœλ‹€. μ—¬λŸ¬ ν”Œλž˜κ·Έκ°€ λ‹΄κΈΈ 수 μžˆλ‹€.

MSG_EOR
λ ˆμ½”λ“œ 끝(end-of-record)을 λ‚˜νƒ€λ‚Έλ‹€. λ°˜ν™˜ 데이터가 λ ˆμ½”λ“œλ₯Ό λλ§ˆμΉœλ‹€. (일반적으둜 SOCK_SEQPACKET νƒ€μž… μ†ŒμΌ“μ—μ„œ μ‚¬μš©)
MSG_TRUNC
λ°μ΄ν„°κ·Έλž¨μ΄ 제곡 버퍼보닀 μ»€μ„œ λ°μ΄ν„°κ·Έλž¨ 끝 뢀뢄을 λ²„λ ΈμŒμ„ λ‚˜νƒ€λ‚Έλ‹€.
MSG_CTRUNC
보쑰 데이터 버퍼에 곡간이 λΆ€μ‘±ν•΄μ„œ 일뢀 μ œμ–΄ 데이터λ₯Ό λ²„λ ΈμŒμ„ λ‚˜νƒ€λ‚Έλ‹€.
MSG_OOB
κΈ΄κΈ‰ λ‚΄μ§€ λŒ€μ—­μ™Έ 데이터λ₯Ό μˆ˜μ‹ ν–ˆμŒμ„ λ‚˜νƒ€λ‚Έλ‹€.
MSG_ERRQUEUE
데이터λ₯Ό μˆ˜μ‹ ν•˜μ§€ μ•Šκ³  μ†ŒμΌ“ 였λ₯˜ νμ—μ„œ ν™•μž₯ 였λ₯˜λ₯Ό λ°›μ•„ μ™”μŒμ„ λ‚˜νƒ€λ‚Έλ‹€.

RETURN VALUE

이 ν˜ΈμΆœλ“€μ€ 받은 λ°”μ΄νŠΈ 수λ₯Ό λ°˜ν™˜ν•œλ‹€. λ˜λŠ” 였λ₯˜ λ°œμƒ μ‹œ -1을 λ°˜ν™˜ν•œλ‹€. 였λ₯˜ μ‹œμ— 였λ₯˜λ₯Ό λ‚˜νƒ€λ‚΄λ„λ‘ errnoλ₯Ό μ„€μ •ν•œλ‹€.

슀트림 μ†ŒμΌ“ μƒλŒ€κ°€ μ§ˆμ„œ μžˆλŠ” λ‹«κΈ°λ₯Ό μˆ˜ν–‰ν–ˆμ„ λ•Œμ—λŠ” λ°˜ν™˜ 값이 0이 λœλ‹€. (전톡적인 "파일 끝" λ°˜ν™˜ 값이닀.)

μ—¬λŸ¬ (κ°€λ Ή μœ λ‹‰μŠ€ 및 인터넷) λ„λ©”μΈμ˜ λ°μ΄ν„°κ·Έλž¨ μ†ŒμΌ“μ—μ„œλŠ” 길이 0인 λ°μ΄ν„°κ·Έλž¨μ„ ν—ˆμš©ν•œλ‹€. 그런 λ°μ΄ν„°κ·Έλž¨μ„ λ°›μ•˜μ„ λ•Œ λ°˜ν™˜ 값은 0이닀.

슀트림 μ†ŒμΌ“μ—μ„œ μˆ˜μ‹  μš”μ²­ν•œ λ°”μ΄νŠΈ μˆ˜κ°€ 0인 κ²½μš°μ—λ„ 0 값을 λ°˜ν™˜ν•  수 μžˆλ‹€.

ERRORS

μ†ŒμΌ“ κ³„μΈ΅μ—μ„œ μƒμ„±ν•˜λŠ” λͺ‡ κ°€μ§€ ν‘œμ€€ 였λ₯˜κ°€ μžˆλ‹€. μΆ”κ°€λ‘œ ν•˜μœ„ ν”„λ‘œν† μ½œ λͺ¨λ“ˆμ—μ„œ λ‹€λ₯Έ 였λ₯˜λ₯Ό μƒμ„±ν•˜μ—¬ λ°˜ν™˜ν•  μˆ˜λ„ μžˆλ‹€. ν”„λ‘œν† μ½œλ³„ 맀뉴얼 νŽ˜μ΄μ§€λ₯Ό μ°Έκ³ ν•˜λΌ.

EAGAIN λ˜λŠ” EWOULDBLOCK
μ†ŒμΌ“μ΄ λ…ΌλΈ”λ‘œν‚ΉμœΌλ‘œ ν‘œμ‹œλΌ μžˆλŠ”λ° μˆ˜μ‹  λ™μž‘μ΄ 블둝 되렀 ν–ˆκ±°λ‚˜, μˆ˜μ‹  νƒ€μž„μ•„μ›ƒμ΄ 섀정돼 μžˆλŠ”λ° 데이터 μˆ˜μ‹  전에 νƒ€μž„μ•„μ›ƒμ΄ λ§Œλ£Œλλ‹€. POSIX.1μ—μ„œλŠ” 이 κ²½μš°μ— μ–΄λŠ μͺ½ 였λ₯˜λ„ λ°˜ν™˜ν•  수 μžˆλ‹€κ³  ν—ˆμš©ν•œλ‹€. λ”°λΌμ„œ 이식성이 μžˆμ–΄μ•Ό ν•˜λŠ” μ‘μš©μ—μ„œλŠ” 두 κ°€λŠ₯성을 λͺ¨λ‘ 확인해야 ν•œλ‹€.
EBADF
인자 sockfdκ°€ μœ νš¨ν•˜μ§€ μ•Šμ€ 파일 λ””μŠ€ν¬λ¦½ν„°μ΄λ‹€.
ECONNREFUSED
원격 ν˜ΈμŠ€νŠΈκ°€ λ„€νŠΈμ›Œν¬ μ—°κ²° ν—ˆμš©μ„ κ±°λΆ€ν–ˆλ‹€. (보톡은 μš”μ²­ν•œ μ„œλΉ„μŠ€κ°€ λ™μž‘ 쀑이지 μ•ŠκΈ° λ•Œλ¬Έμ΄λ‹€.)
EFAULT
μˆ˜μ‹  버퍼 포인터(λ“€)이 ν”„λ‘œμ„ΈμŠ€μ˜ μ£Όμ†Œ 곡간 밖을 가리킀고 μžˆλ‹€.
EINTR
μ‚¬μš© κ°€λŠ₯ν•œ 데이터가 있기 전에 μ‹œκ·Έλ„ 전달에 μ˜ν•΄ μˆ˜μ‹ μ΄ μ€‘λ‹¨λ˜μ—ˆλ‹€. signal(7) μ°Έκ³ .
EINVAL
μœ νš¨ν•˜μ§€ μ•Šμ€ 인자λ₯Ό μ „λ‹¬ν–ˆλ‹€.
ENOMEM
recvmsg()λ₯Ό μœ„ν•œ λ©”λͺ¨λ¦¬λ₯Ό ν• λ‹Ήν•  수 μ—†λ‹€.
ENOTCONN
μ†ŒμΌ“μ΄ μ—°κ²° μ§€ν–₯ ν”„λ‘œν† μ½œμ— 연계돼 μžˆλŠ”λ° 연결이 λ˜μ§€ μ•Šμ•˜λ‹€. (connect(2) 및 accept(2) μ°Έκ³ .)
ENOTSOCK
파일 λ””μŠ€ν¬λ¦½ν„° sockfdκ°€ μ†ŒμΌ“μ„ 가리킀고 μžˆμ§€ μ•Šλ‹€.

CONFORMING TO

POSIX.1-2001, POSIX.1-2008, 4.4BSD (4.2BSDμ—μ„œ 이 μΈν„°νŽ˜μ΄μŠ€λ“€μ΄ 처음 λ“±μž₯).

POSIX.1μ—μ„œλŠ” MSG_OOB, MSG_PEEK, MSG_WAITALL ν”Œλž˜κ·Έλ§Œ κΈ°μˆ ν•œλ‹€.

NOTES

길이가 0인 λ°μ΄ν„°κ·Έλž¨μ΄ λŒ€κΈ° 쀑인 경우 read(2)와 flags 인자 0인 recv()의 λ™μž‘μ΄ λ‹€λ₯΄λ‹€. 이 κ²½μš°μ— read(2)λŠ” 효λ ₯이 μ—†μ§€λ§Œ (λ°μ΄ν„°κ·Έλž¨μ΄ λŒ€κΈ° μ€‘μœΌλ‘œ λ‚¨λŠ”λ‹€) recv()λŠ” λŒ€κΈ° 쀑인 λ°μ΄ν„°κ·Έλž¨μ„ μ†Œλͺ¨ν•œλ‹€.

socklen_t νƒ€μž…μ€ POSIXμ—μ„œ κ³ μ•ˆν•œ 것이닀. accept(2)도 μ°Έκ³ .

POSIX.1에 λ”°λ₯΄λ©΄ msghdr ꡬ쑰체의 msg_controllen ν•„λ“œκ°€ socklen_t νƒ€μž…μ΄μ–΄μ•Ό ν•˜μ§€λ§Œ glibcμ—μ„œλŠ” ν˜„μž¬ size_t νƒ€μž…μœΌλ‘œ ν•˜κ³  μžˆλ‹€.

호좜 ν•œ λ²ˆμ— μ—¬λŸ¬ λ°μ΄ν„°κ·Έλž¨μ„ μˆ˜μ‹ ν•  수 μžˆλŠ” λ¦¬λˆ…μŠ€ μ „μš© μ‹œμŠ€ν…œ ν˜ΈμΆœμ— λŒ€ν•œ λ‚΄μš©μ€ recvmmsg(2)λ₯Ό 보라.

EXAMPLE

getaddrinfo(3)μ—μ„œ recvfrom() μ‚¬μš©λ‘€λ₯Ό λ³Ό 수 μžˆλ‹€.

SEE ALSO

fcntl(2), getsockopt(2), read(2), recvmmsg(2), select(2), shutdown(2), socket(2), cmsg(3), sockatmark(3), ip(7), ipv6(7), socket(7), tcp(7), udp(7), unix(7)


2017-09-15

⚠️ **GitHub.com Fallback** ⚠️