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