tail head cat sleep
QR code linking to this page

Man page  — SEND

명칭

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

내용

프로그램 라이브러리

Standard C Library (libc, -lc)

서식

#include <sys/types.h>
#include <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() 함수 호출은 BSD 4.2 그리고 등장했습니다.

SEND (2) February 15, 1995

tail head cat sleep
QR code linking to this page


Ben Bullock이 유닉스 매뉴얼 페이지에서 서비스에 대한 의견을 주시기 바랍니다. Privacy policy.

The wonderful thing about standards is that there are so many of them to choose from.
— Grace Murray Hopper