send(2) - wariua/manpages-ko GitHub Wiki
send, sendto, sendmsg - μμΌμΌλ‘ λ©μμ§ λ³΄λ΄κΈ°
#include <sys/types.h>
#include <sys/socket.h>
ssize_t send(int sockfd, const void *buf, size_t len, int flags);
ssize_t sendto(int sockfd, const void *buf, size_t len, int flags,
const struct sockaddr *dest_addr, socklen_t addrlen);
ssize_t sendmsg(int sockfd, const struct msghdr *msg, int flags);
μμ€ν
νΈμΆ send()
, sendto()
, sendmsg()
λ₯Ό μ΄μ©ν΄ λ€λ₯Έ μμΌμΌλ‘ λ©μμ§λ₯Ό μ μ‘νλ€.
send()
νΈμΆμ μμΌμ΄ μ°κ²° μνμΌ λλ§ (κ·Έλμ λμ μμ μκ° μλ €μ§ κ²½μ°μλ§) μΈ μ μλ€. send()
μ write(2)
μ μ μΌν μ°¨μ΄λ flags
μ μ‘΄μ¬ μ¬λΆλ€. flags
μΈμκ° 0μ΄λ©΄ send()
λ write(2)
μ λλ±νλ€. λν λ€μ νΈμΆμ
send(sockfd, buf, len, flags);
λ€μκ³Ό λλ±νλ€.
sendto(sockfd, buf, len, flags, NULL, 0);
sockfd
μΈμλ μ‘μ μμΌμ νμΌ λμ€ν¬λ¦½ν°μ΄λ€.
sendto()
λ₯Ό μ°κ²° λͺ¨λ (SOCK_STREAM
, SOCK_SEQPACKET
) μμΌμ μ°λ©΄ dest_addr
λ° addrlen
μΈμλ₯Ό 무μνλ©° (λ μΈμκ° NULLκ³Ό 0μ΄ μλλ©΄ EISCONN
μ λ°νν μλ μμ), μμΌμ΄ μ€μ λ‘ μ°κ²°λΌ μμ§ μμ κ²½μ° ENOTCONN
μ€λ₯λ₯Ό λ°ννλ€. κ·Έ μΈ κ²½μ°μλ dest_addr
μ΄ λμμ μ£Όμμ΄κ³ addrlen
μ΄ κ·Έ ν¬κΈ°λ₯Ό λνλΈλ€. sendmsg()
μμλ msg.msg_name
μ΄ λμμ μ£Όμμ΄κ³ msg.msg_namelen
μ΄ κ·Έ ν¬κΈ°λ₯Ό λνλΈλ€.
send()
μ sendto()
μμλ buf
μ λ©μμ§κ° μμΌλ©° κΈΈμ΄κ° len
μ΄λ€. sendmsg()
μμλ msg.msg_iov
λ°°μ΄μ νλͺ©λ€μ΄ λ©μμ§λ₯Ό κ°λ¦¬ν¨λ€. sendmsg()
νΈμΆλ‘λ (μ μ΄ μ 보λΌκ³ λ νλ) 보쑰 λ°μ΄ν°λ₯Ό 보λ΄λ κ²λ κ°λ₯νλ€.
λ©μμ§κ° λ무 κΈΈμ΄μ νμ νλ‘ν μ½μ μμμ μΌλ‘ ν΅κ³Όν μ μμΌλ©΄ EMSGSIZE
λ₯Ό λ°ννλ©° λ©μμ§λ μ μ‘λμ§ μλλ€.
send()
μμλ μ΄λ€ μ λ¬ μ€ν¨ νμλ μ묡μ μ΄μ§ μλ€. λ‘컬μμ μ€λ₯λ₯Ό νμ§νλ©΄ λ°ν κ° -1λ‘ λνλΈλ€.
λ©μμ§κ° μμΌμ μ‘μ λ²νΌμ λ€μ΄κ°μ§ μμΌλ©΄ 보ν΅μ send()
κ° λΈλ‘ λλ€. νμ§λ§ μμΌμ λ
ΌλΈλ‘νΉ I/O λͺ¨λλ‘ λ§λ€μ΄ λμΌλ©΄ EAGAIN
μ΄λ EWOULDBLOCK
μ€λ₯λ‘ μ€ν¨νκ² λλ€. select(2) νΈμΆμ μ΄μ©ν΄ λ°μ΄ν°λ₯Ό λ 보λ΄λ κ² κ°λ₯νμ§ μμλΌ μ μλ€.
flags
μΈμλ λ€μ νλκ·Έλ€μ 0κ° μ΄μ λΉνΈ OR ν΄μ ꡬμ±νλ€.
-
MSG_CONFIRM
(리λ μ€ 2.3.15λΆν°) - μ΄λ€ μ§μ²μ΄ μμλ€κ³ , μ¦ μλμκ²μ μ±κ³΅μ μΌλ‘ μλ΅μ λ°μλ€κ³ λ§ν¬ κ³μΈ΅μκ² μλ¦°λ€. μλ € μ£Όμ§ μμΌλ©΄ λ§ν¬ κ³μΈ΅μμλ μ£ΌκΈ°μ μΌλ‘ (κ°λ Ή μ λμΊμ€νΈ ARPλ₯Ό ν΅ν΄) μ΄μμ μ¬μ‘°μ¬νκ² λλ€.
SOCK_DGRAM
λ°SOCK_RAW
μμΌμμλ§ μ ν¨νλ©° νμ¬ IPv4 λ° IPv6μλ§ κ΅¬νλΌ μλ€. μμΈν λ΄μ©μ arp(7)λ₯Ό 보λΌ. MSG_DONTROUTE
- κ²μ΄νΈμ¨μ΄λ₯Ό μ΄μ©ν΄ ν¨ν·μ 보λ΄μ§ μκ³ μ§μ μ°κ²°λ λ§μ νΈμ€νΈλ‘λ§ λ³΄λΈλ€. μΌλ°μ μΌλ‘ μ§λ¨ νλ‘κ·Έλ¨μ΄λ λΌμ°ν νλ‘κ·Έλ¨μμλ§ μ΄λ€. λΌμ°ν μ νλ νλ‘ν μ½ μ‘±μλ§ κ·μ λΌ μλ€. κ°λ Ή ν¨ν· μμΌμ μλλ€.
-
MSG_DONTWAIT
(리λ μ€ 2.2λΆν°) - λ
ΌλΈλ‘νΉ λμμ μΌ λ€. λμμ΄ λΈλ‘ λλ €λ κ²½μ°
EAGAIN
μ΄λEWOULDBLOCK
μ λ°ννλ€. (fcntl(2)F_SETFL
λμμ ν΅ν΄)O_NONBLOCK
νλκ·Έλ₯Ό μ€μ ν κ²½μ°μ λΉμ·ν λμ λ°©μμΈλ°,MSG_DONTWAIT
μ΄ νΈμΆλ³ μ΅μ μΈ λ°λ©΄O_NONBLOCK
μ μ΄λ¦° νμΌ κΈ°μ νλͺ©μ λν μ€μ μ΄μ΄μ (open(2) μ°Έκ³ ) νΈμΆ νλ‘μΈμ€ λ΄ λͺ¨λ μ€λ λλΏ μλλΌ κ°μ μ΄λ¦° νμΌ κΈ°μ νλͺ©μ κ°λ¦¬ν€λ νμΌ λμ€ν¬λ¦½ν°λ₯Ό κ°μ§ λ€λ₯Έ νλ‘μΈμ€μλ μν₯μ λΌμΉκ² λλ€. -
MSG_EOR
(리λ μ€ 2.2λΆν°) - (
SOCK_SEQPACKET
νμ μμΌμ²λΌ λ μ½λ κ°λ μ μ§μνλ κ²½μ°μ) λ μ½λλ₯Ό λλΈλ€. -
MSG_MORE
(리λ μ€ 2.4.4λΆν°) -
νΈμΆμκ° λ³΄λ΄λ €λ λ°μ΄ν°κ° λ μλ€. TCP μμΌμμ μ΄ νλκ·Έλ₯Ό μ¬μ©ν΄μ
TCP_CORK
μμΌ μ΅μ (tcp(7) μ°Έκ³ )κ³Ό κ°μ ν¨κ³Όλ₯Ό μ»λλ° μ΄ νλκ·Έλ νΈμΆλ³λ‘ μ€μ ν μ μλ€λ μ μ΄ λ€λ₯΄λ€.리λ μ€ 2.6λΆν°λ UDP μμΌμμλ μ΄ νλκ·Έλ₯Ό μ§μνλ€. μ΄ νλκ·Έλ₯Ό μ€μ ν νΈμΆλ‘ λ³΄λΈ λ°μ΄ν° λͺ¨λλ₯Ό 컀λμμ λ°μ΄ν°κ·Έλ¨ ν κ°λ‘ λ§λ€κ² νλ©° μ΄ νλκ·Έλ₯Ό μ§μ νμ§ μμ νΈμΆμ μνν΄μΌ κ·Έ λ°μ΄ν°κ·Έλ¨μ΄ μ μ‘λλ€. (udp(7)μμ μ€λͺ νλ
UDP_CORK
μμΌ μ΅μ λ μ°Έκ³ .) -
MSG_NOSIGNAL
(리λ μ€ 2.2λΆν°) - μ€νΈλ¦Ό μ§ν₯ μμΌμμ μλκ° μ°κ²°μ λ«μ κ²½μ°μ
SIGPIPE
μκ·Έλμ λ°μμν€μ§ μλλ€.EPIPE
μ€λ₯λ μ¬μ ν λ°ννλ€. sigaction(2)μΌλ‘SIGPIPE
λ₯Ό 무μνλ κ²κ³Ό λμμ΄ λΉμ·νλ°,MSG_NOSIGNAL
μ νΈμΆλ³ κΈ°λ₯μ΄κ³SIGPIPE
무μνκΈ°λ νλ‘μΈμ€ μμ±μ μ€μ νμ¬ νλ‘μΈμ€ λ΄ λͺ¨λ μ€λ λμ μν₯μ μ€λ€. MSG_OOB
- μ§μνλ (κ°λ Ή
SOCK_STREAM
νμ ) μμΌμΈ κ²½μ°μ λμμΈ λ°μ΄ν°λ₯Ό 보λΈλ€. νμ νλ‘ν μ½μμλ λμμΈ λ°μ΄ν°λ₯Ό μ§μν΄μΌ νλ€.
sendmsg()
μμ μ¬μ©νλ 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
νλλ κ·Έ μ£Όμμ ν¬κΈ°λ‘ μ€μ ν΄μΌ νλ€. μ°κ²°λ μμΌμμλ μ΄ νλλ€μ κ°κ° NULLκ³Ό 0μΌλ‘ μ§μ ν΄μΌ νλ€.
msg_iov
λ° msg_iovlen
νλλ writev(2)μμμ²λΌ μ€μΊν°-κ°λ μμΉλ€μ μ§μ νλ€.
msg_control
λ° msg_controllen
λ©€λ²λ₯Ό μ΄μ©ν΄ μ μ΄ μ 보λ₯Ό λ³΄λΌ μ μλ€. 컀λμμ μ²λ¦¬ν μ μλ μμΌλ³ μ μ΄ λ²νΌ μ΅λ κΈΈμ΄λ₯Ό /proc/sys/net/core/optmem_max
κ°μ΄ μ ννλ€. socket(7) μ°Έκ³ .
msg_flags
νλλ 무μνλ€.
μ±κ³΅ μ μ΄ νΈμΆλ€μ λ³΄λΈ λ°μ΄νΈ μλ₯Ό λ°ννλ€. μ€λ₯ μ -1μ λ°ννλ©° errno
λ₯Ό μ μ ν μ€μ νλ€.
μμΌ κ³μΈ΅μμ μμ±νλ λͺ κ°μ§ νμ€ μ€λ₯κ° μλ€. μΆκ°λ‘ νμ νλ‘ν μ½ λͺ¨λμμ λ€λ₯Έ μ€λ₯λ₯Ό μμ±νμ¬ λ°νν μλ μλ€. νλ‘ν μ½λ³ λ§€λ΄μΌ νμ΄μ§λ₯Ό μ°Έκ³ νλΌ.
EACCES
-
(κ²½λ‘λͺ μΌλ‘ μλ³νλ μ λμ€ λλ©μΈ μμΌμμ) λμ μμΌ νμΌμμ μ°κΈ° κΆνμ΄ κ±°λΆλμλ€. λλ κ²½λ‘ μ λλΆμ ν λλ ν°λ¦¬μμ νμ κΆνμ΄ κ±°λΆλμλ€. (path_resolution(7) μ°Έκ³ .)
(UDP μμΌμμ) μ λμΊμ€νΈ μ£ΌμμΈ κ²μ²λΌ λ€νΈμν¬/λΈλ‘λμΊμ€νΈ μ£Όμλ‘ λ³΄λ΄λ €λ μλλ₯Ό νλ€.
-
EAGAIN
λλEWOULDBLOCK
- μμΌμ΄ λ ΌλΈλ‘νΉμΌλ‘ νμλΌ μλλ° μμ² λμμ΄ λΈλ‘ λλ € νλ€. POSIX.1-2001μμλ μ΄ κ²½μ°μ μ΄λ μͺ½ μ€λ₯λ λ°νν μ μλ€κ³ νμ©νλ©° μ΄ μμλ€μ΄ κ°μ κ°μ κ°μ ΈμΌ νλ€κ³ μꡬνμ§ μλλ€. λ°λΌμ μ΄μμ±μ΄ μμ΄μΌ νλ μμ©μμλ λ κ°λ₯μ±μ λͺ¨λ νμΈν΄μΌ νλ€.
EAGAIN
- (μΈν°λ· λλ©μΈ λ°μ΄ν°κ·Έλ¨ μμΌ)
sockfd
κ° κ°λ¦¬ν€λ μμΌμ΄ 미리 μ£Όμμ κ²°μλμ§ μμμ μμ ν¬νΈμ κ²°μνλ € ν λ μμ ν¬νΈ λ²μ λ΄μ λͺ¨λ ν¬νΈ λ²νΈκ° νμ¬ μ¬μ© μ€μμ μκ² λλ€. ip(7)μ/proc/sys/net/ipv4/ip_local_port_range
μ€λͺ μ°Έκ³ . EALREADY
- λ€λ₯Έ λΉ λ₯Έ μ΄κΈ°(Fast Open)κ° μ§ν μ€μ΄λ€.
EBADF
-
sockfd
κ° μ ν¨ν μ΄λ¦° νμΌ λμ€ν¬λ¦½ν°κ° μλλ€. ECONNRESET
- μλκ° μ°κ²°μ μ¬μ€μ νλ€.
EDESTADDRREQ
- μμΌμ΄ μ°κ²° λͺ¨λκ° μλλ©° μλ μ£Όμκ° μ€μ λΌ μμ§ μλ€.
EFAULT
- μΈμλ‘ μ ν¨νμ§ μμ μ¬μ©μ κ³΅κ° μ£Όμλ₯Ό μ§μ νλ€.
EINTR
- λ°μ΄ν°λ₯Ό μ μ‘νκΈ° μ μ μκ·Έλμ΄ λ°μνλ€. signal(7) μ°Έκ³ .
EINVAL
- μ ν¨νμ§ μμ μΈμλ₯Ό μ λ¬νλ€.
EISCONN
- μ°κ²° λͺ¨λ μμΌμ΄ μ΄λ―Έ μ°κ²°λμ΄ μλλ° μμ μλ₯Ό μ§μ νλ€. (μ§κΈμ μ΄ μ€λ₯λ₯Ό λ°νν μλ μκ³ μμ μ μ§μ μ 무μν μλ μλ€.)
EMSGSIZE
- λ©μμ§λ₯Ό μμμ μΌλ‘ 보λ΄μΌ νλ μμΌ νμ μΈλ° λ³΄λΌ λ©μμ§μ ν¬κΈ° λλ¬Έμ λΆκ°λ₯νλ€.
ENOBUFS
- λ€νΈμν¬ μΈν°νμ΄μ€μ μΆλ ₯ νκ° κ°λ μ°Όλ€. 보ν΅μ μΈν°νμ΄μ€κ° μ‘μ μ λ©μ·λ€λ νμμ΄μ§λ§ μκ°μ μΈ νΌμ‘ λλ¬Έμ λ°μν μλ μλ€. (μ μμ μΌλ‘ 리λ μ€μμλ λ°μνμ§ μλλ€. μ₯μΉ νκ° λμΉ λ ν¨ν·μ κ·Έλ₯ μ‘°μ©ν λ²λ¦°λ€.)
ENOMEM
- μ¬μ© κ°λ₯ λ©λͺ¨λ¦¬ μμ.
ENOTCONN
- μμΌμ΄ μ°κ²°λΌ μμ§ μμΌλ©° λμμ μ£Όμ§ μμλ€.
ENOTSOCK
- νμΌ λμ€ν¬λ¦½ν°
sockfd
κ° μμΌμ κ°λ¦¬ν€κ³ μμ§ μλ€. EOPNOTSUPP
-
flags
μΈμμ μ΄λ€ λΉνΈκ° μμΌ νμ μ λ§μ§ μλ€. EPIPE
- μ°κ²° μ§ν₯ μμΌμμ λ‘컬 μ’
λ¨μ΄ λ«νλ€. μ΄ κ²½μ°μ
MSG_NOSIGNAL
μ μ€μ νμ§ μμμΌλ©΄ νλ‘μΈμ€κ°SIGPIPE
λ λ°κ² λλ€.
4.4BSD, SVr4, POSIX.1-2001. 4.2BSDμμ μ΄ μΈν°νμ΄μ€λ€μ΄ μ²μ λ±μ₯νλ€.
POSIX.1-2001μμλ MSG_OOB
λ° MSG_EOR
νλκ·Έλ§ κΈ°μ νλ€. POSIX.1-2008μμ MSG_NOSIGNAL
λͺ
μΈλ₯Ό μΆκ°νλ€. MSG_CONFIRM
νλκ·Έλ 리λ
μ€ νμ₯μ΄λ€.
POSIX.1-2001μ λ°λ₯΄λ©΄ msghdr
ꡬ쑰체μ msg_controllen
νλκ° socklen_t
νμ
μ΄μ΄μΌ νμ§λ§ glibcμμλ νμ¬ size_t
νμ
μΌλ‘ νκ³ μλ€.
νΈμΆ ν λ²μ μ¬λ¬ λ°μ΄ν°κ·Έλ¨μ μ μ‘ν μ μλ 리λ μ€ μ μ© μμ€ν νΈμΆμ λν λ΄μ©μ sendmmsg(2)λ₯Ό 보λΌ.
리λ
μ€μμ ENOTCONN
λμ EPIPE
λ₯Ό λ°νν μλ μλ€.
getaddrinfo(3)μμ sendto()
μ¬μ©λ‘λ₯Ό λ³Ό μ μλ€.
fcntl(2), getsockopt(2)
, recv(2), select(2), sendfile(2), sendmmsg(2), shutdown(2), socket(2), write(2)
, cmsg(3), ip(7), ipv6(7), socket(7), tcp(7), udp(7), unix(7)
2017-09-15