SEND(2)

명칭
send, sendto, sendmsg - 소켓으로부터 메세지를 송신한다

프로그램 라이브러리
libc

서식
<sys/types.h> <sys/socket.h> ssize_t send(int s, const void *msg, size_t len, int flags) ssize_t sendto(int s, const void *msg, size_t len, int flags, const struct sockaddr *to, socklen_t tolen) ssize_t sendmsg(int s, const struct msghdr *msg, int flags)

해설
send(), sendto() 및 sendmsg() (은)는, 메세지를 다른 소켓에 송신하는데 사용됩니다. send() (은)는, 소켓이 접속되었다 상태에 있을 때만 사용할 수 있는데 대해, sendto() (와)과 sendmsg() (은)는 언제라도 사용할 수 있습니다.

타겟의 주소를 to 그리고 줘 tolen 그리고 그 사이즈를 지정합니다. 메세지의 길이는 len 그리고 지정합니다. 메세지가 너무 길어 기반이 되는 프로토콜을 불가분에 통과할 수 없는 경우, 에러 EMSGSIZE (을)를 돌려주어, 메세지를 송신하지 않습니다.

send() 그럼, 배송할 수 없는 것은 전혀 나타나지 않습니다. 반환값 -1 은 로컬로 검출된 에러를 나타냅니다.

송신하는 메세지를 보관 유지하는 스페이스가 소켓에 없는 경우 send() (은)는 통상 블록 합니다. 다만, 소켓이 비블로킹 입출력 모드로 설정되어 있는 경우는 별도입니다. select(2) 호출을 사용해, 한층 더 많은 데이터를 언제 송신할 수 있을까 판정할 수 있습니다.

flags 파라미터에는 다음에 나타나는 것의 집 1 개(살) 또는 복수를 포함하는 것이 가능합니다.

    #define	MSG_OOB		0x1   /* 대역외 데이터를 처리한다 */
    #define	MSG_PEEK	0x2   /* 착신 메세지를 들여다 본다 */
    #define	MSG_DONTROUTE	0x4   /* 루팅을 우회도로 해,
                                     인터페이스를 직접 사용한다 */
    #define	MSG_EOR		0x8   /* 이 데이터로 레코드를 종료한다 */
    #define	MSG_EOF		0x100 /* 이 데이터로 트랜잭션(transaction)를 종료한다 */

플래그 MSG_OOB (은)는, 이 개념을 서포트하는 소켓 (예를 들어, SOCK_STREAM) 위의 “대역외” 데이터를 송신하는데 사용됩니다. 기반이 되고 있는 프로토콜도 “대역외” 데이터를 서포트할 필요가 있습니다. MSG_EOR (은)는, 이 개념을 서포트하는 프로토콜용의 레코드 마크를 나타내는데 사용됩니다. MSG_EOF (은)는, 소켓의 송신측의 셧다운을 요구해, 지정 데이터의 종료시에, 적절한 지시의 송신을 요구합니다. 이 플래그는, PF_INET 프로토콜 패밀리의 SOCK_STREAM 소켓에 관해서만 실장되어 트랜잭션(transaction) TCP ( ttcp(4) (을)를 참조)를 실장하는데 사용됩니다. MSG_DONTROUTE (은)는 통상, 진단 프로그램 또는 경로 설정 프로그램으로 사용됩니다.

msghdr 구조체의 상세한 것에 대하여는, recv(2) (을)를 참조해 주세요.

반환값
이 호출은 송신된 캐릭터수를 돌려주어, 에러가 일어났을 경우는 -1 (을)를 돌려줍니다.

에러
send(), sendto() 및 sendmsg() (은)는 다음의 경우에 실행에 실패합니다.

[EBADF]
    무효인 기술자가 지정되었습니다.

[EACCES]
    행선지 주소는 브로드캐스트 어드레스이며, SO_BROADCAST 하지만 소켓상으로 설정되어 있지 않습니다.

[ENOTSOCK]
    인수 s 하지만 소켓이 아닙니다.

[EFAULT]
    파라미터에 대해 무효인 유저 공간 주소가 지정되었습니다.

[EMSGSIZE]
    소켓은 메세지가 불가분에 송신되는 것을 요구하고 있습니다만, 송신되는 메세지의 사이즈에서는 불가능합니다.

[EAGAIN]
    소켓은 비블로킹과 마크 되고 있어 요구된 조작은 블록 되겠지요.

[ENOBUFS]
    시스템은 내부 버퍼를 할당할 수가 없었습니다. 버퍼가 이용 가능하게 되었을 때에 조작이 성공할 가능성이 있습니다.

[ENOBUFS]
    네트워크 인터페이스용의 출력 큐가 만배였습니다. 이것은 일반적으로, 인터페이스가 송신을 정지했지만, 그것이 일시적인 congestion에 의해 일어난 것을 나타냅니다.

[EHOSTUNREACH]
    리모트 호스트에 도달할 수 없었습니다.

[ECONNREFUSED]
    소켓이, ICMP 행선지불도달 메세지를, 마지막에 송신한 메세지로부터 수신했습니다. 전형적으로는, 수신자가 리모트 포트로 대기하고 있지 않는 것을 의미합니다.

[EHOSTDOWN]
    리모트 호스트가 다운하고 있었습니다.

버그
sendmsg() (은)는 데이터가 전송 되어 버릴 때까지 반드시 블록 하지 않기 때문에, 오픈되고 있는 파일 기술자를 AF_UNIX 도메인 소켓 ( recv(2) (을)를 참조) 경유로 송신해, 그리고 실제로 송신되기 전에 close() 할 가능성이 있습니다. 그 결과, 수신측은 닫은 파일 기술자를 얻게 됩니다. 이것을 방지하는 확인 메카니즘의 실장은 어플리케이션으로 실시할 필요가 있습니다.

관련 항목
fcntl(2), getsockopt(2), recv(2), select(2), socket(2), write(2)

역사
send() 함수 호출은 4.2BSD 그리고 등장했습니다.