SEND(2)

이름
send, sendto, sendmsg - 소켓으로부터의 메시지를 보낸다.

사용법
#include <sys/types.h>
#include <sys/socket.h>

int send(int s, const void *msg, size_t len, int flags);
int sendto(int s, const void *msg, size_t len, int flags, const struct sockaddr *to, socklen_t tolen);
int sendmsg(int s, const struct msghdr *msg, int flags);

설명
Send, sendto, 그리고 sendmsg 는 다른 소켓으로 메시지를 보내는데 사용된다. Send 은 소켓이 connected 상태에 있을 때 사용된다. 반면 sendto 와 sendmsg 언제든 사용할 수 있다.

목표의 주소는 to 가 그것의 크기를 정하는 tolen 과 함께 주어진다. 메시지의 길이는 len. 으로 주어진다. 메시지가 너무 길어서 기초적인 프로토콜을 사용해 자동으로 넘어갈 수 없다면, 에러 EMSGSIZE 가 반환되고, 메시지는 전해지지 않는다.

send. 에는 전달을 실패할 징후는 없다. 국부적으로 지적되는 에러는 -1의 반환값에 의해 지적된다.

메시지가 소켓의 send 버퍼에 맞지 않으면, send 는 소켓이 non-blocking I/O mode에 있지 않는다면 일반적으로 막는다 non-blocking mode에서 이런 경우엔, EAGAIN 을 반환한다. select(2) 호출은 언제 다음 자료를 보낼지를 결정하는데 쓰인다.

flags 매개 변수는 flagword이고, 아래 flag를 가질 수 있다:

MSG_OOB
    out-of-band data를 이 개념을 지원하는 소켓으로 보낸다 (e.g. SOCK_STREAM); 기초 프로토콜은 반드시 out-of-band data를 지원한다..

MSG_DONTROUTE
    패킷을 전송하는데 게이트웨이를 사용하지 않고, 직접 연결된 네트웍을 통해서 호스트로 보낸다. 이것은 diagnostic 혹은 routing program에 의해서만 사용된다. 이것은 오직 프로토콜군을 위해서만 정의된다; 패킷 소켓은 하지 않는다.

MSG_DONTWAIT
    non-blocking operation을 가능케 한다; operation이 막혔을 때 EAGAIN 가 반환된다. (이것은 또한 O_NONBLOCK 을 F_SETFL fcntl(2) 와 함께 사용하는 것을 가능하게 할 수 있다.)

MSG_NOSIGNAL
    다른 한쪽 끝이 연결을 끊었을 때, 소켓으로부터 비롯된 스트림상의 에러에 SIGPIPE 을 보내지 않도록 요구한다. EPIPE 에러는 여전히 반환된다.

msghdr 구조에 대한 설명을 보려면 recv(2) 을 보라. msg_control 와 msg_controllen 구성요소를 사용하는 제어 정보를 보낼 수 있다. 커널이 처리할 수 있는 최대 제어 버퍼의 길이는 net.core.optmem_max sysctl에 의해 소켓단위로 제한되어 있다. ; socket(7). 을 보라

반환값
보내진 문자의 수를 반환하거나 에러 발생시 -1을 반환한다.

에러
이것은 소켓 레이어에 의해 발생되는 몇몇 표준적인 에러다. 추가적인 에러는 기초 프로토콜 모듈로부터 발생되거나 반환된다; 각각의 매뉴얼을 참조하라.

EBADF
    실제하지 않는 descriptor가 지정되었다.

ENOTSOCK
    독립변수 s 가 소켓이 아니다.

EFAULT
    실제하지 않는 사용자 공간 주소가 매개변수로 지정되었다.

EMSGSIZE
    소켓이 메시지를 자동으로 보내줄 것을 요청했지만, 보내진 메시지의 크기가 이것을 불가능하게 하였다.

EAGAIN혹은 EWOULDBLOCK
    소켓이 non-blocking을 표시하였고, 요구된 operation이 깨졌다.

ENOBUFS
    네트웍 인터페이스를 위한 출력 큐가 가득 찼다. 이것은 일반적으로 인터페이스가 전송을 멈추는 것으로 나타난다. 하지만 이것은 순간적인 정체로 인한 것이다. (이것은 리눅스에서는 일어날 수 없다. 장치 큐가 넘칠 때 패킷은 조용히 중단된다.)

EINTR
    신호가 발생했다.

ENOMEM
    사용 가능한 메모리가 없다.

EINVAL
    실제 사용되지 않는 독립변수가 통과했다.

EPIPE
    소켓으로부터의 연결에서 로컬 앤드가 꺼졌다. MSG_NOSIGNAL 이 설정되어 있지 않을 경우, 프로세스 역시 SIGPIPE 를 받는다.

호환
4.4BSD, SVr4, POSIX 1003.1g draft (이 함수는 4.2BSD에 있다).

주의
위에서 주어진 초기치는 Single Unix Specification을 따른다, glibc2와 마찬가지이다: flags 독립변수는 BSD 4.*에서 `int'이다. 하지만, libc4와 libc5에선 `unsigned int'이다; len 독립변수는 BSD 4.*과 libc4에서 `int'이다. 하지만 libc5에선 `size_t'이다; tolen 독립변수는 BSD 4.*과 libc4, libc5에서 `int'이다. accept(2). 도 참조하라.

관련 항목
fcntl(2), recv(2), select(2), getsockopt(2), sendfile(2), socket(2), write(2), socket(7), ip(7), tcp(7), udp(7)

역자
ASPLINUX<man@asp-linux.co.kr>, 2000년 8월 1일