, sendto를, sendmsg를 보낼 - 소켓에서 메시지를 전송

개요

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

INT 보내기 (INT의 S , CONST 공극 *의 MSG , size_t와 LEN , int로 플래그 );
INT sendto를 (INT S , CONST 공극 *의 MSG , size_t와 LEN , INT 플래그 , CONST 구조체의 SOCKADDR * ,의 socklen_t의 tolen 독립 );
INT sendmsg (INT S , CONST 구조체는 msghdr *의 MSG , int로 플래그 );

기술

보내기 , sendto를 , 그리고 sendmsg 다른 소켓에 메시지를 전송합니다. 보내기는 동안에 만, 소켓을 연결하는 데 사용 sendto를 하고 sendmsg는 어떤 경우에 사용할 수있다.

대상 주소를 사용 하도록 지정 tolen 독립은 길이를 정의합니다.와 메시지의 길이 LEN 메시지가 낮은 계층 프로토콜을 통과 할 너무 긴 경우 지정이., 함수가 반환 EMSGSIZE의 오류 메시지가 전송되지 않습니다.

데이터 전송 과정에서 오류가 발생에 반환되지 않습니다 보내기. 로컬 오류가 발생하면 -1을 반환한다.

전송 될 메시지가 소켓 버퍼의 길이가 현재 가능한 것보다 큰 경우, 전송 소켓 비 블록 입출력 모드 아니라면 차단 될 것이다. 비 블록 모드의 경우에 반환 EAGAIN의 오류.의 시스템 호출 SELECT (2) 이상의 데이터가 전송 될 때 검출하는데 사용될 수있다.

매개 변수 플래그는 부호 단어, 당신은 다음과 같은 플래그를 포함 할 수 있습니다 :

소켓 밴드 데이터에 대한 지원,
MSG_OOB는 보낼 대역 (예를 들어, (대역) 데이터 SOCK_STREAM의 프로토콜에 기초하여 지원해야 형 소켓) 대역 데이터.
MSG_DONTROUTE
... 아니 소켓 패킷, 게이트웨이에 사용뿐만 아니라 플래그 데이터를 수신 할 수있는 네트워크에 연결된 호스트로 직접 패킷을 전송은 일반적으로 전용이 플래그를 사용하여 진단 및 라우팅 절차 라우팅 프로토콜 제품군을 사용합니다.
MSG_DONTWAIT
비 블록 동작을 이용하여 상기 작업이 리턴 차단이 필요한 경우 EAGAIN의 에러 (도 사용할 수 F_SETFL에게 (2)는 fcntl을 제공 O_NONBLOCK가 이 기능을 달성한다.)
MSG_NOSIGNAL
소켓 스트림 연결의 다른 쪽 끝은 전송 중단하지 않을 경우 SIGPIPE의 신호를,하지만 여전히 반환 EPIPE의 오류입니다.
MSG_CONFIRM (이상에서만 리눅스 2.3에 대한)
통지 링크 층 전달 공정이 일어난 링크 층의 타 단부가 통지되지 않은 경우 성공적인 응답을 얻었다는 (예컨대 자유 ARP를 통해)를 인접한 호스트 네트워크 일반 검색을 수행한다 ..에만 사용될 수 SOCK_DGRAM SOCK_RAW의 타입 소켓은, IPv4 및 IPv6와는 효과적인 세부 사항 참조입니다 ARP를 (. 7)

구조 는 msghdr 다음과 같다. 상세한 내용에 정의 RECV (2) 아래에있다.

는 msghdr {구조체 
    공극 * msg_name을; / * 주소 옵션 * / 
    의 socklen_t msg_namelen; / * 어드레스 길이 * / 
    구조체 iovec * msg_iov; / * 메시지 어레이 * / 
    이 size_t msg_iovlen; / * msg_iov * / 요소의 수 
    공극 * S msg_control 필드; / * 추가 정보 * / 아래 참조 
    / * 보조 데이터 버퍼의 길이 * /; msg_controllen의 socklen_t이 필드 
    / / * 메시지 수신 플래그 * 상기 msg_flags에서 INT 
};

당신이 사용될 수 msg_control필드 msg_controllen의이 . 상기 제어 메시지 버퍼의 최대 길이를 처리 할 수있는 임의의 제어 정보를 전달 부재 커넬 는 net.core.optmem_max 각 소켓 sysctl을 정의한다; 볼 소켓 . (7).

반환 값

그렇지 않으면 -1, 성공적으로 보낸 문자 수를 반환합니다.

오류 코드

표준 오류 중 일부는 다른 소켓 레이어에서 생성되어 생성 된 하위 계층 프로토콜 모듈이며, 각각의 매뉴얼 페이지를 참조하십시오.

EBADF
잘못된 설명을 지정.
ENOTSOCK
매개 변수 소켓이 아니다.
EFAULT
매개 변수는 불법 사용자 주소 공간을 지정합니다.
EMSGSIZE
범위를 벗어 메시지 길이.
EAGAIN 또는 EWOULDBLOCK
비 - 블로킹 (non-blocking) 소켓하지만, 요청 된 작업은 차단이 필요합니다.
ENOBUFS
네트워크 인터페이스 출력 큐 장치 큐 오버 플로우 패킷은 단순히 폐기 할 때, 리눅스가 발생하지 않는 임시 정체 (있을 수 있고, 이는 일반적으로 상기 인터페이스는 전송을 중지 한 것을 의미한다. 가득.
ENTRY
수신 신호.
ENOMEM
사용 가능한 메모리가 없습니다.
선택
매개 변수 전달은 불법입니다.
EPIPE
로컬 터미널 소켓을 연결하는 과정이도 수신이 경우. 닫혀 SIGPIPE의 않는 신호 MSG_NOSIGNAL  

추천

출처www.cnblogs.com/fanweisheng/p/11098313.html