WSARecvEx 함수(winsock.h)
WSARecvEx 함수는 연결된 소켓 또는 바인딩된 연결 없는 소켓에서 데이터를 수신합니다. WSARecvEx 함수는 flags 매개 변수가 정보를 반환하는 데만 사용된다는 점을 제외하고 recv 함수와 유사합니다. 데이터그램 프로토콜을 사용하는 동안 부분 메시지가 수신되면 MSG_PARTIAL 비트는 함수에서 반환될 때 flags 매개 변수에 설정됩니다.
구문
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를 호출하여 특정 오류 코드를 검색할 수 있습니다.
오류 코드 | 의미 |
---|---|
가상 회로가 시간 초과 또는 기타 오류로 인해 종료되었습니다. 더 이상 소켓을 사용할 수 없으므로 응용 프로그램이 소켓을 닫아야 합니다. | |
가상 회로가 하드 또는 중단한 닫기를 실행하는 원격 쪽에서 재설정되었습니다. 더 이상 소켓을 사용할 수 없으므로 응용 프로그램이 소켓을 닫아야 합니다. UPD-데이터그램 소켓에서 이 오류는 이전 송신 작업으로 인해 ICMP "포트에 연결할 수 없습니다."라는 메시지가 표시되었음을 나타냅니다. | |
buf 매개 변수는 사용자 주소 공간의 유효한 부분에 완전히 포함되지 않습니다. | |
차단 Windows 소켓 1.1 호출이 진행 중이거나 서비스 공급자가 여전히 콜백 함수를 처리하고 있습니다. | |
WSACancelBlockingCall 호출에 의해 (차단) 호출이 취소되었습니다. | |
소켓이 바인딩되지 않았거나 알 수 없는 플래그가 지정되었거나 SO_OOBINLINE 사용하도록 설정된 소켓에 대해 MSG_OOB 지정되었거나(바이트 스트림 소켓에만 해당) len 이 0 또는 음수였습니다. | |
네트워크 하위 시스템이 실패했습니다. | |
연결 지향 소켓의 경우 이 오류는 작업이 진행 중인 동안 오류를 감지한 연결 유지 활동으로 인해 연결이 끊어졌는지 나타냅니다. 데이터그램 소켓의 경우 이 오류는 TTL(Time to Live)이 만료되었음을 나타냅니다. | |
소켓이 연결되지 않았습니다. | |
설명자가 소켓이 아닙니다. | |
MSG_OOB 지정되었지만 소켓은 SOCK_STREAM 형식과 같은 스트림 스타일이 아니거나, OOB 데이터가 이 소켓과 연결된 통신 도메인에서 지원되지 않거나, 소켓이 단방향이며 보내기 작업만 지원합니다. | |
소켓이 종료되었습니다. 종료가 SD_RECEIVE 또는 SD_BOTH 로 설정된 방법을 사용하여 호출된 후 소켓에서 WSARecvEx를 사용할 수 없습니다. | |
네트워크 오류로 인해 또는 피어 시스템이 응답하지 않기 때문에 연결이 삭제되었습니다. | |
소켓이 차단 해제로 표시되고 수신 작업이 차단됩니다. | |
이 함수를 사용하기 전에 성공적인 WSAStartup 호출이 발생해야 합니다. |
설명
Windows Sockets 2의 Microsoft 구현에 포함된 WSARecvEx 함수는 flags 매개 변수가 단일 특정 용도로 사용된다는 점을 제외하고 보다 일반적인 recv 함수와 유사합니다. flags 매개 변수는 메시지 지향 프로토콜을 사용할 때 부분 메시지 또는 전체 메시지가 수신되는지 여부를 나타내는 데 사용됩니다.
flags 매개 변수가 가리키는 값은 입력에서 무시됩니다. 따라서 WSARecvEx 함수에 플래그를 전달하여 동작을 수정할 수 없습니다. flags 매개 변수가 가리키는 값은 출력에서 설정됩니다. 이는 입력 시 flags 매개 변수가 가리키는 값이 함수의 동작을 수정할 수 있는 recv 및 WSARecv 함수와 다릅니다.
WSARecvEx 및 recv 함수는 스트림 지향 프로토콜에 대해 동일하게 작동합니다.
flags 매개 변수는 부분 메시지를 받는 두 가지 일반적인 상황을 수용합니다.
- 애플리케이션의 데이터 버퍼 크기가 메시지 크기보다 작고 메시지가 우연히 두 조각으로 도착하는 경우
- 메시지가 다소 크면 여러 조각으로 도착해야 합니다.
recv 함수는
wSARecvEx 및 WSARecv 함수는 recv 함수가 항상 메시지 지향 전송 프로토콜에 대한 각 호출에 대해 단일 메시지를 수신한다는 것입니다.
또한 recv 함수에는 수신된 데이터가 부분 메시지일 뿐임을 애플리케이션에 나타내는 수단이 없습니다. 애플리케이션은 각 recv 호출 후 오류 코드 WSAEMSGSIZE를 확인하여 메시지가 부분인지 완료되었는지 확인하기 위한 자체 프로토콜을 빌드해야 합니다. 애플리케이션 버퍼가 전송되는 데이터보다 작으면 메시지의 상당 부분을 사용자의 버퍼에 복사하고 오류 코드 WSAEMSGSIZE와 함께 recv 가 반환됩니다.
recv에 대한 후속 호출은 메시지의 다음 부분을 가져옵니다.
메시지 지향 전송 프로토콜을 위해 작성된 애플리케이션은 메시지 크기 조정이 애플리케이션의 데이터 전송 프로토콜에 의해 보장되지 않는 경우 이 가능성을 위해 코딩되어야 합니다. 애플리케이션은 recv 를 사용하고 프로토콜 자체를 관리할 수 있습니다. 또는 애플리케이션에서 WSARecvEx를 사용하고 MSG_PARTIAL 비트가 flags 매개 변수에 설정되어 있는지 검사 수 있습니다.
WSARecvEx 함수는 매우 큰 메시지가 증분 방식으로 도착할 때 수신된 메시지가 부분인지 아니면 완료되었는지를 확인하는 보다 효과적인 방법을 개발자에게 제공합니다. 예를 들어 애플리케이션이 1메가바이트 메시지를 보내는 경우 전송 프로토콜은 실제 네트워크를 통해 메시지를 보내려면 메시지를 중단해야 합니다. 이론적으로 수신 측의 전송 프로토콜이 메시지의 모든 데이터를 버퍼링할 수 있지만 리소스 측면에서는 비용이 매우 많이 듭니다. 대신 WSARecvEx 를 사용하여 오버헤드를 최소화하고 애플리케이션 기반 프로토콜의 필요성을 제거할 수 있습니다.
요구 사항
지원되는 최소 클라이언트 | Windows 2000 Professional[데스크톱 앱만] |
지원되는 최소 서버 | Windows 2000 Server[데스크톱 앱만] |
대상 플랫폼 | Windows |
헤더 | winsock.h(Mswsock.h 포함) |
라이브러리 | Mswsock.lib |
DLL | Mswsock.dll |