send

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

프로그램 라이브러리
     Standard C Library (libc, -lc)

서식
     <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 그리고 등장했습니다.