WSARecvEx

WSARecvEx 함수는 flags 매개변수가 입력/출력용 매개변수라는 점을 제외하고는 기존 recv 함수와 같은 기능을 합니다. 데이터그램 프로토콜을 사용해서 전체 메시지가 아닌 일부분만을 수신할 때, flags 매개변수에 MSG_PARTIAL 플래그가 설정되게 됩니다.

int PASCAL FAR WSARecvEx (
        SOCKET  
s,
        char FAR*  
buf,
        int  
len,
        int*  
flags
);

 

Parameters

s
[입력] 접속된 소켓을 식별하는 소켓 기술자

buf
[출력] 들어오는 데이터를 받아낼 버퍼

len
[입력]
buf 매개변수의 길이

flags
[입력/출력] 데이터 그램 소켓에서 수신한 메시지가 통째로 수신되었는지 일부분만 수신되었는지를 식별하는 플래그

 

Remarks

윈도즈 소켓2에서 준비된 함수중 하나인 WSARecvEx 함수는 flags 매개변수가 입/출력 용으로 사용된다는 점을 제외하고는 recv 함수와 유사합니다. recv 함수에서의 flags 는 입력용으로만 사용되었었죠. 암튼, 이 추가적인 출력용 매개변수는 메시지 지향형 프로토콜을 사용할 때 메시지 전체가 수신되었는지 일부분만 수신 되었는지를 알아내는데 사용됩니다. 즉, 기존의 recv 함수는 각각의 recv 함수의 호출로 단일 메시지 만을 수신한데 반해서 WSARecvEx 함수는 지정한 버퍼로 다 담을 수 없을 크기의 메시지도 수신할 수 있다는 기능을 추가 하게된 것입니다.

WSARecvEx 함수는 스트림 지향형 프로토콜 에서는 recv 함수와 똑같이 사용됩니다.

그밖에 msdn에서는 여러 가지 설명을 하고 있는데, 별로 중요한 것 같지 않아서 그만 생략 합니다. 부가적인 정보를 더 원하신다면, msdn을 참고 하시기 바랍니다. 물론 해석은 본인이 부담하셔야죠. ^^

 

Return Values

에러가 발생하지 않는다면, WSARecvEx 함수는 수신된 바이트의 길이를 반환합니다. 만약 접속이 종료되었다면(close), 0을 반환하게 됩니다. 추가로 몇마디 하자면, 메시지 지향형 프로토콜에서 일부분의 메시지를 수신한 경우 flags 매개변수에서 MSG_PARTIAL 비트는 설정되게 됩니다. 반면, 완전한 메시지가 수신된다면, flags 매개변수에 MSG_PARTIAL 비트는 설정되지 않습니다.

에러가 발생한 경우 SOCKET_ERROR을 반환하게 되고 WSAGetLastError 함수를 이용해서 특정한 에러코드를 얻어낼 수 있습니다.

 

Error Codes

WSANOTINITIALISED

이 함수를 사용하기 이전에 WSAStartup 함수를 성공적으로 호출해야 합니다.

WSAENETDOWN

네트웍 서브 시스템에 에러가 발생했습니다.

WSAEFAULT buf 매개변수가 제대로 할당된 메모리 공간을 가지고 있지 않습니다.
WSAENOTCONN 소켓이 접속되어 있지 않습니다.
WSAEINTR WSACancelBlockingCall 함수에 의해서 작업이 종료되었습니다.
WSAEINPROGRESS 블록킹 윈속1.1 호출이 현재 처리중에 있거나, 서비스 프로바이더가 아직 콜백함수를 처리하고 있습니다.
WSAENETRESET 접속이 상대방 호스트의 리셋으로 인하여 종료되었습니다.
WSAENOTSOCK 지정한 기술자가 소켓 기술자가 아닙니다.
WSAEOPNOTSUPP MSG_OOB 가 지정되었으나 소켓의 SOCK_STREAM과 같은 형태의 스트림 형식의 소켓이 아니고, out-of-band 데이터가 지원되지 않습니다. 또는 지정한 소켓이 단일 방향으로 전송용으로만 사용되는 소켓입니다.
WSAESHUTDOWN 소켓이 셧다운 되었습니다.
WSAEWOULDBLOCK 소켓이 비동기 소켓으로 마킹되어 있고, 수신연산이 바로 완료될 수 없는 경우 입니다.
WSAEINVAL 소켓이 바인드 되어 있지 않거나, 알 수 없는 플래그가 사용되었거나, SO_OOBINLINE을 활성화 시킨 상태에서 MSG_OOB를 지정햇습니다. 또는 len 매개변수가 0 이거나 음수 입니다.
WSAECONNABORTED 가상 연결망이 타임아웃이나 다른이유로 끊겨(terminate) 버렸습니다.
WSAETIMEDOUT 접속이 네트웍 오류나 상태방 시스템의 오류로 끊겨(drop) 버렸습니다.
WSAECONNRESET 가상 연경망이 상대방의 "hard" 또는 "abortive" 종료를 수행하여 끊겨(reset) 버렸습니다.

 

QuickInfo

Windows NT : 사용가능
Windows CE : 지원하지 않습니다.
Header : mswsock.h.
Import Library : mswsock.lib.

See Also

overview, recvfrom, select, send, socket, WSAAsyncSelect