recvmsg 서브루틴

용도

모든 소켓에서 메시지를 수신합니다.

라이브러리

표준 C 라이브러리(libc.a)

구문

#include <sys/socket.h>
int recvmsg ( Socket,  Message,  Flags)
int Socket;
struct msghdr Message [ ];
int Flags;
int recvmmsg ( Socket, MessageVec, Num_msg,  Flags, Timeout)
int Socket;
struct mmsghdr MessageVec [ ];
unsigned int Num_msg ;
int Flags;
struct timespec *Timeout

설명

Recvmsg 하위 루틴은 연결되지 않은 소켓 또는 연결된 소켓에서 메시지를 수신합니다. Recvmsg 서브루틴은 메시지의 길이를 반환합니다. 메시지가 너무 길어 제공된 버퍼에 맞지 않는 경우 메시지를 보낸 소켓 유형에 따라 초과 바이트가 잘릴 수 있습니다.

소켓에 사용 가능한 메시지가 없으면 recvmsg 하위 루틴은 메시지가 도착할 때까지 기다립니다. 소켓이 차단되지 않고 메시지를 사용할 수 없는 경우 recvmsg 하위 루틴이 실패한 것입니다.

선택 하위 루틴을 사용하여 더 많은 데이터가 도착하는 시기를 결정합니다.

Recvmsg 서브루틴은 직접 제공된 매개변수의 수를 줄이기 위해 msghdr 구조를 사용합니다. Msghdr 구조는 thesys/socketsys/socket.h 파일에 정의되어 있습니다. BSD 4.3 리노에서는 msghdr 구조의 크기와 멤버가 수정되었습니다. 이전 구조를 시작하려는 애플리케이션은 COMPAT_43 정의한 상태로 컴파일해야 합니다. 기본 동작은 BSD 4.4 동작입니다.

Recvmsg 서브루틴이 포함된 모든 애플리케이션은 _BSD 매크로를 특정 값으로 설정하여 컴파일해야 합니다. 허용되는 값은 43과 44입니다. 그리고 모든 소켓 응용프로그램에는 BSD libbsd.a 라이브러리가 포함되어야 합니다.

' recvmmsg 서브루틴은 소켓에서 호출자 소켓으로 여러 메시지를 수신하는 ' recvmsg ' 서브루틴의 확장입니다. 이 서브루틴은 일부 애플리케이션에 성능상의 이점이 있습니다. ' recvmmsg ' 서브루틴은 수신 작업 중 대기 시간 초과를 지원합니다.

' sockfd ' 인수는 데이터를 수신하는 소켓의 파일 설명자입니다. ' msgvec 인수는 ' mmsghdr ' 구조체의 배열에 대한 포인터입니다. 이러한 인수는 ' sys/socket.h file 에 정의되어 있습니다.

' recvmmsg 서브루틴에서 돌아오면 ' msgvec ' 구조의 연속적인 요소가 업데이트되어 수신된 각 메시지에 대한 정보를 포함합니다. Msg_len 필드에는 수신된 메시지의 크기가 포함됩니다. Msg_hdr 필드의 하위 필드는 ' recvmsg 하위 루틴에 설명된 대로 업데이트됩니다. ' recvmsg 호출의 반환 값은 업데이트되는 ' msgvec ' 필드의 요소 수를 나타냅니다.

매개변수

항목 설명
소켓 소켓의 고유 이름을 지정합니다.
메시지 수신 메시지의 주소와 발신자 주소의 공백이 모두 포함된 msghdr 구조의 주소를 가리킵니다.
플래그 서브루틴이 메시지 수신에 대한 제어권을 행사할 수 있도록 허용합니다. 전화를 수신하는 데 사용되는 Flags 매개변수는 다음 목록에 표시된 값 중 하나 이상을 논리적으로 OR하여 구성됩니다:
MSG_OOB
대역 외 데이터를 처리합니다. 대역 외 데이터의 중요성은 프로토콜에 따라 다릅니다.
MSG_PEEK
들어오는 데이터를 들여다봅니다. 데이터는 계속 읽지 않은 것으로 처리되며 다음번 recv( ) 또는 유사한 함수를 호출할 때 읽게 됩니다.
MSG_WAITALL
요청된 바이트 수를 읽을 때까지 함수가 반환하지 않도록 요청합니다. 이 함수는 신호가 잡히거나 연결이 종료되거나 소켓에 오류가 보류 중인 경우에만 요청된 바이트 수보다 적은 바이트 수를 반환할 수 있습니다.
MSG_WAITFORONE
첫 번째 메시지가 수신된 후 MSG_DONTWAIT 플래그를 켭니다.

/sys/socket.h 파일에는 Flags 매개변수에 사용할 수 있는 값이 포함되어 있습니다.

MessageVec 수신 메시지에 대한 ' msghdr ' 구조, 발신자 주소를 위한 공간 및 배열의 총 요소 수를 나타내는 값을 포함하는 ' mmsghdr 구조의 배열을 가리킵니다.
Num_msg 컨트롤이 호출 소켓으로 반환되기 전에 수신할 메시지 수를 정의합니다.
시간종료

Timeout 인수는 수신 작업에 대한 시간 제한 값(초와 나노초 단위로 지정)을 정의하는 ' timespec ' 구조를 가리킵니다. 타임아웃 값이 ' NULL '인 경우 ' vlen 메시지가 수신되거나 타임아웃 값이 만료될 때까지 ' recvmmsg ' 하위 루틴 호출이 차단됩니다. ' recvmmsg 서브루틴에 대한 비차단 호출은 발신자 소켓에서 사용 가능한 모든 메시지(제한은 ' vlen 매개변수로 지정됨)를 읽고 서브루틴에서 호출 함수로 즉시 반환합니다.

리턴 값

' recvmsg 서브루틴이 성공적으로 완료되면 메시지 길이(바이트)가 반환되고 ' recvmmsg ' 서브루틴의 경우 수신된 메시지 수가 반환됩니다.

' recvmsg ' 또는 ' recvmmsg 서브루틴이 실패하면 서브루틴 핸들러는 다음 기능을 수행합니다:

  • 호출 프로그램에 -1 값을 반환합니다.
  • 특정 오류를 나타내는 오류 코드를 errno 전역 변수로 이동합니다.

오류 코드

다음 오류 코드 중 하나라도 발생하면 recvmsg 하위 루틴이 실패합니다:

오류 설명
EBADF 소켓 매개변수가 유효하지 않습니다.
ECONRESET 원격 피어가 연결을 강제로 종료합니다.
기본값 주소 매개변수가 사용자 주소 공간의 쓰기 가능한 부분에 있지 않습니다.
EINTR 수신에 데이터를 사용할 수 있기 전에 신호가 전달되어 recvmsg 하위 루틴이 중단되었습니다.
EINVAL Msghdr 구조의 길이가 잘못되었거나 MSG_OOB 플래그가 설정되어 대역 외 데이터를 사용할 수 없습니다.
EMSGSIZE Message가 가리키는 msghdr 구조의 msg_iovlen 멤버가 0보다 작거나 같거나 IOV_MAX보다 큽니다.
에노부프 시스템에서 작업을 수행할 수 있는 리소스가 부족합니다.
에노프로토옵트 이 프로토콜은 64비트가 지원되지 않습니다.
ENOTCONN 연결되지 않은 SOCK_STREAM 소켓에서 수신이 시도됩니다.
엔오츠옥 소켓 매개변수는 소켓이 아닌 파일을 참조합니다.
EOPNOTSUPP MSG_OOB 플래그가 SOCK_DGRAM 소켓에 설정되어 있거나, MSG_OOB 플래그가 AF_UNIX 소켓에 설정되어 있습니다.
시간이 다 됐어 연결 설정 중에 연결 시간이 초과되었거나 활성 연결에서 전송 시간 초과가 발생했습니다.
EWOULDDBLOCK 소켓이 차단되지 않음으로 표시되어 있으며 연결이 허용되지 않습니다.