WSARecvEx 함수(mswsock.h)

WSARecvEx 함수는 연결된 소켓 또는 바인딩된 연결 없는 소켓에서 데이터를 받습니다. WSARecvEx 함수는 flags 매개 변수가 정보를 반환하는 데만 사용된다는 점을 제외하고 recv 함수와 비슷합니다. 데이터그램 프로토콜을 사용하는 동안 부분 메시지를 받으면 함수에서 반환될 때 MSG_PARTIAL 비트가 flags 매개 변수에 설정됩니다.

참고WSARecvEx 함수는 Windows 소켓 사양에 대한 Microsoft 전용 확장입니다.
 

구문

int WSARecvEx(
  [in]      SOCKET s,
  [out]     char   *buf,
  [in]      int    len,
  [in, out] int    *flags
);

매개 변수

[in] s

연결된 소켓을 식별하는 설명자입니다.

[out] buf

들어오는 데이터를 수신할 버퍼에 대한 포인터입니다.

[in] len

buf 매개 변수가 가리키는 버퍼의 길이(바이트)입니다.

[in, out] flags

데이터그램 소켓에 대해 메시지가 완전히 또는 부분적으로 수신되는지 여부를 지정하는 표시기입니다.

반환 값

오류가 발생하지 않으면 WSARecvEx 는 수신된 바이트 수를 반환합니다. 연결이 닫힌 경우 0을 반환합니다. 또한 부분 메시지를 받은 경우 MSG_PARTIAL 비트가 flags 매개 변수에 설정됩니다. 전체 메시지를 받은 경우 MSG_PARTIAL 플래그에 설정되지 않습니다.

그렇지 않으면 SOCKET_ERROR 값이 반환되고 WSAGetLastError를 호출하여 특정 오류 코드를 검색할 수 있습니다.

중요 스트림 지향 전송 프로토콜의 경우 WSARecvEx에서 반환 시 MSG_PARTIAL 설정되지 않습니다. 이 함수는 스트림 전송 프로토콜의 recv 함수와 동일하게 동작합니다.
 
오류 코드 의미
WSAECONNABORTED
가상 회로가 시간 초과 또는 기타 오류로 인해 종료되었습니다. 더 이상 소켓을 사용할 수 없으므로 응용 프로그램이 소켓을 닫아야 합니다.
WSAECONNRESET
가상 회로가 하드 또는 중단한 닫기를 실행하는 원격 쪽에서 재설정되었습니다. 더 이상 소켓을 사용할 수 없으므로 응용 프로그램이 소켓을 닫아야 합니다. UPD-데이터그램 소켓에서 이 오류는 이전 송신 작업으로 인해 ICMP "포트에 연결할 수 없습니다."라는 메시지가 표시되었음을 나타냅니다.
WSAEFAULT
buf 매개 변수가 사용자 주소 공간의 유효한 부분에 완전히 포함되지는 않습니다.
WSAEINPROGRESS
차단 Windows Sockets 1.1 호출이 진행 중이거나 서비스 공급자가 여전히 콜백 함수를 처리하고 있습니다.
WSAEINTR
(차단) 호출이 WSACancelBlockingCall 호출에 의해 취소되었습니다.
WSAEINVAL
소켓이 바인딩된 상태로 바인딩되지 않았거나 알 수 없는 플래그가 지정되었거나 SO_OOBINLINE 사용하도록 설정된 소켓에 대해 MSG_OOB 지정되었거나(바이트 스트림 소켓에만 해당) len 이 0 또는 음수였습니다.
WSAENETDOWN
네트워크 하위 시스템이 실패했습니다.
WSAENETRESET
연결 지향 소켓의 경우 이 오류는 작업이 진행되는 동안 오류를 감지한 연결 유지 작업으로 인해 연결이 끊어졌는지 나타냅니다. 데이터그램 소켓의 경우 이 오류는 TTL(Time to Live)이 만료되었음을 나타냅니다.
WSAENOTCONN
소켓이 연결되지 않았습니다.
WSAENOTSOCK
설명자가 소켓이 아닙니다.
WSAEOPNOTSUPP
MSG_OOB 지정되었지만 소켓이 SOCK_STREAM 형식과 같은 스트림 스타일이 아니거나, OOB 데이터가 이 소켓과 연결된 통신 도메인에서 지원되지 않거나, 소켓이 단방향이며 보내기 작업만 지원합니다.
WSAESHUTDOWN
소켓이 종료되었습니다. SD_RECEIVE 또는 SD_BOTH 로 설정된 방법을 사용하여 종료가 호출된 후에는 소켓에서 WSARecvEx를 사용할 수 없습니다.
WSAETIMEDOUT
네트워크 오류로 인해 또는 피어 시스템이 응답하지 않기 때문에 연결이 삭제되었습니다.
WSAEWOULDBLOCK
소켓이 차단되지 않는 것으로 표시되고 수신 작업이 차단됩니다.
WSANOTINITIALISED
이 함수를 사용하기 전에 성공적인 WSAStartup 호출이 발생해야 합니다.

설명

Windows Sockets 2의 Microsoft 구현에 포함된 WSARecvEx 함수는 flags 매개 변수가 단일 특정 용도로 사용된다는 점을 제외하고 보다 일반적인 recv 함수와 비슷합니다. flags 매개 변수는 메시지 지향 프로토콜을 사용할 때 부분 메시지 또는 전체 메시지가 수신되는지 여부를 나타내는 데 사용됩니다.

flags 매개 변수가 가리키는 값은 입력에서 무시됩니다. 따라서 WSARecvEx 함수에 플래그를 전달하여 동작을 수정할 수 없습니다. flags 매개 변수가 가리키는 값은 출력에서 설정됩니다. 이는 입력 시 flags 매개 변수가 가리키는 값이 함수의 동작을 수정할 수 있는 recvWSARecv 함수와 다릅니다.

WSARecvExrecv 함수는 스트림 지향 프로토콜에 대해 동일하게 작동합니다.

flags 매개 변수는 부분 메시지가 수신되는 두 가지 일반적인 상황을 수용합니다.

  • 애플리케이션의 데이터 버퍼 크기가 메시지 크기보다 작고 메시지가 우연히 두 부분으로 도착하는 경우
  • 메시지가 다소 크고 여러 조각으로 도착해야 하는 경우.
MSG_PARTIAL 비트는 부분 메시지가 수신되었을 때 WSARecvEx에서 반환될 때 flags 매개 변수가 가리키는 값에 설정됩니다. 전체 메시지를 받은 경우 MSG_PARTIAL flags 매개 변수가 가리키는 값에 설정되지 않습니다.

recv 함수는
wSARecvExWSARecv 함수는 recv 함수가 항상 메시지 지향 전송 프로토콜에 대한 각 호출에 대해 단일 메시지를 수신한다는 것입니다. 또한 recv 함수에는 수신된 데이터가 부분 메시지일 뿐임을 애플리케이션에 나타내는 수단이 없습니다. 애플리케이션은 recv를 호출할 때마다 오류 코드 WSAEMSGSIZE를 확인하여 메시지가 부분인지 완료되었는지 확인하기 위한 자체 프로토콜을 빌드해야 합니다. 애플리케이션 버퍼가 전송되는 데이터보다 작으면 적합할 만큼의 메시지가 사용자의 버퍼에 복사되고 오류 코드 WSAEMSGSIZE와 함께 recv 가 반환됩니다. recv에 대한 후속 호출은 메시지의 다음 부분을 가져옵니다.

메시지 지향 전송 프로토콜용으로 작성된 애플리케이션은 애플리케이션의 데이터 전송 프로토콜에 의해 메시지 크기 조정이 보장되지 않는 경우 이 가능성을 위해 코딩되어야 합니다. 애플리케이션은 recv 를 사용하고 프로토콜 자체를 관리할 수 있습니다. 또는 애플리케이션에서 WSARecvEx를 사용하고 MSG_PARTIAL 비트가 flags 매개 변수에 설정되어 있는지 검사 수 있습니다.

WSARecvEx 함수는 매우 큰 메시지가 증분 방식으로 도착할 때 수신된 메시지가 부분인지 아니면 완료되었는지를 확인하는 보다 효과적인 방법을 개발자에게 제공합니다. 예를 들어 애플리케이션이 1메가바이트 메시지를 보내는 경우 전송 프로토콜은 실제 네트워크를 통해 메시지를 보내기 위해 메시지를 중단해야 합니다. 이론적으로는 수신 측의 전송 프로토콜이 메시지의 모든 데이터를 버퍼링할 수 있지만 리소스 측면에서는 비용이 많이 듭니다. 대신 WSARecvEx 를 사용하여 오버헤드를 최소화하고 애플리케이션 기반 프로토콜의 필요성을 제거할 수 있습니다.

참고 지정된 스레드에서 시작된 모든 I/O는 해당 스레드가 종료될 때 취소됩니다. 겹치는 소켓의 경우 작업이 완료되기 전에 스레드가 닫히면 보류 중인 비동기 작업이 실패할 수 있습니다. 자세한 내용은 ExitThread 함수를 참조하세요.
 

요구 사항

요구 사항
지원되는 최소 클라이언트 Windows 2000 Professional[데스크톱 앱만]
지원되는 최소 서버 Windows 2000 Server[데스크톱 앱만]
대상 플랫폼 Windows
헤더 mswsock.h(Mswsock.h 포함)
라이브러리 Mswsock.lib
DLL Mswsock.dll

추가 정보

WSAAsyncSelect

WSARecv

Winsock 함수

Winsock 참조

Recv

recvfrom

선택

send

socket