recv(2) System Calls Manual recv(2) recv recvfrom recvmsg - (libc -lc) #include ssize_t recv(size_t size; int sockfd, void buf[size], size_t size, int flags); ssize_t recvfrom(size_t size; int sockfd, void buf[restrict size], size_t size, int flags, struct sockaddr *_Nullable restrict src_addr, socklen_t *_Nullable restrict addrlen); ssize_t recvmsg(int sockfd, struct msghdr *msg, int flags); recv() recvfrom() recvmsg() . . . recv() read(2) flags. flags recv() read(2) ( ). recv(sockfd, buf, size, flags); recvfrom(sockfd, buf, size, flags, NULL, NULL); . . ( fcntl(2)) -1 errno EAGAIN EWOULDBLOCK. . select(2) poll(2) epoll(7) . (flags) flags OR : MSG_CMSG_CLOEXEC (recvmsg() Linux 2.6.23) UNIX SCM_RIGHTS ( unix(7)). O_CLOEXEC open(2). MSG_DONTWAIT ( 2.2) EAGAIN EWOULDBLOCK. O_NONBLOCK ( fcntl(2) F_SETFL) MSG_DONTWAIT O_NONBLOCK ( open(2)) . MSG_ERRQUEUE ( Linux 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; /* Error number */ uint8_t ee_origin; /* Where the error originated */ uint8_t ee_type; /* Type */ uint8_t ee_code; /* Code */ uint8_t ee_pad; /* Padding */ uint32_t ee_info; /* Additional information */ uint32_t ee_data; /* Other data */ /* More data may follow */ }; struct sockaddr *SO_EE_OFFENDER(struct sock_extended_err *); ee_errno errno . ee_origin . . SO_EE_OFFENDER . sa_family sockaddr AF_UNSPEC sockaddr . . ( cmsg_len cmsghdr). MSG_ERRQUEUE msghdr. . MSG_OOB . . MSG_PEEK . . MSG_TRUNC ( Linux 2.2) (AF_PACKET) ( Linux 2.4.27/2.6.8) netlink ( Linux 2.6.22) UNIX ( Linux 3.4): . tcp(7). MSG_WAITALL ( Linux 2.2) . . . recvfrom() recvfrom() buf. size. src_addr NULL src_addr. addrlen -. src_addr. addrlen . addrlen . src_addr addrlen NULL. recv() recv() ( connect(2)). : recvfrom(fd, buf, size, flags, NULL, NULL); recvmsg() recvmsg() msghdr . : 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; /* ( socklen_t POSIX) */ int cmsg_level; /* */ int cmsg_type; /* */ /* unsigned char cmsg_data[]; */ }; cmsg(3). IP UNIX. unix(7) ip(7). msg_flags msghdr recvmsg(). : MSG_EOR ( SOCK_SEQPACKET). MSG_TRUNC . MSG_CTRUNC . MSG_OOB . MSG_ERRQUEUE . MSG_CMSG_CLOEXEC ( 2.6.23) MSG_CMSG_CLOEXEC flags recvmsg(). -1 . errno . 0 ( " "). ( UNIX ) . 0. 0 0. . . EAGAIN EWOULDBLOCK . POSIX.1 . EBADF sockfd . ECONNREFUSED ( ). EFAULT . EINTR signal(7). EINVAL . ENOMEM recvmsg(). ENOTCONN ( connect(2) accept(2)). ENOTSOCK sockfd . POSIX.1 msg_controllen msghdr socklen_t msg_iovlen int glibc size_t. POSIX.1-2024. POSIX.1-2001 4.2BSD. POSIX.1 MSG_OOB MSG_PEEK MSG_WAITALL. read(2) recv() flags . read(2) ( ) recv() . recvmmsg(2) . recvfrom() getaddrinfo(3). 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) 3 . . : . 6.18 29 2025 recv(2)