WSARecv 함수(winsock2.h)
WSARecv 함수는 연결된 소켓 또는 바인딩된 연결 없는 소켓에서 데이터를 받습니다.
구문
int WSAAPI WSARecv(
[in] SOCKET s,
[in, out] LPWSABUF lpBuffers,
[in] DWORD dwBufferCount,
[out] LPDWORD lpNumberOfBytesRecvd,
[in, out] LPDWORD lpFlags,
[in] LPWSAOVERLAPPED lpOverlapped,
[in] LPWSAOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine
);
매개 변수
[in] s
연결된 소켓을 식별하는 설명자입니다.
[in, out] lpBuffers
WSABUF 구조체 배열에 대한 포인터입니다. 각 WSABUF 구조체에는 버퍼에 대한 포인터와 버퍼의 길이(바이트)가 포함됩니다.
[in] dwBufferCount
lpBuffers 배열의 WSABUF 구조체 수입니다.
[out] lpNumberOfBytesRecvd
수신 작업이 즉시 완료되는 경우 이 호출에서 받은 데이터의 수(바이트)에 대한 포인터입니다.
잠재적으로 잘못된 결과를 방지하려면 lpOverlapped 매개 변수가 NULL이 아닌 경우 이 매개 변수에 NULL을 사용합니다. lpOverlapped 매개 변수가 NULL이 아닌 경우에만 이 매개 변수는 NULL일 수 있습니다.
[in, out] lpFlags
WSARecv 함수 호출의 동작을 수정하는 데 사용되는 플래그에 대한 포인터입니다. 자세한 내용은 주의 섹션을 참조하세요.
[in] lpOverlapped
WSAOVERLAPPED 구조체에 대한 포인터입니다(오버랩되지 않은 소켓의 경우 무시됨).
[in] lpCompletionRoutine
형식: _In_opt_ LPWSAOVERLAPPED_COMPLETION_ROUTINE
수신 작업이 완료되었을 때 호출되는 완료 루틴에 대한 포인터입니다(오버랩되지 않은 소켓의 경우 무시됨).
반환 값
오류가 발생하지 않고 수신 작업이 즉시 완료되면 WSARecv 는 0을 반환합니다. 이 경우 호출 스레드가 경고 가능한 상태이면 완료 루틴이 이미 호출되도록 예약됩니다. 그렇지 않으면 SOCKET_ERROR 값이 반환되고 WSAGetLastError를 호출하여 특정 오류 코드를 검색할 수 있습니다. 오류 코드 WSA_IO_PENDING 겹치는 작업이 성공적으로 시작되었으며 나중에 완료가 표시됨을 나타냅니다. 다른 오류 코드는 겹치는 작업이 성공적으로 시작되지 않았으며 완료 표시가 발생하지 않음을 나타냅니다.
오류 코드 | 의미 |
---|---|
가상 회로가 시간 초과 또는 기타 오류로 인해 종료되었습니다. | |
스트림 소켓의 경우 원격 쪽에서 가상 회로를 다시 설정했습니다. 더 이상 소켓을 사용할 수 없으므로 응용 프로그램이 소켓을 닫아야 합니다. UDP 데이터그램 소켓의 경우 이 오류는 이전 보내기 작업으로 인해 ICMP "포트 연결할 수 없음" 메시지가 발생했음을 나타냅니다. | |
소켓 은 메시지 지향이며 가상 회로는 원격 쪽에서 정상적으로 닫혔습니다. | |
lpBuffers 매개 변수는 사용자 주소 공간의 유효한 부분에 완전히 포함되지 않습니다. | |
차단 Windows Sockets 1.1 호출이 진행 중이거나 서비스 공급자가 여전히 콜백 함수를 처리하고 있습니다. | |
WSACancelBlockingCall 함수에 의해 (차단) 호출이 취소되었습니다. | |
소켓이 바인딩되지 않았습니다(예: 바인딩 사용). | |
메시지가 너무 커서 지정된 버퍼에 맞지 않으며(신뢰할 수 없는 프로토콜에만 해당) 버퍼에 맞지 않는 메시지의 후행 부분이 삭제되었습니다. | |
네트워크 하위 시스템이 실패했습니다. | |
연결 지향 소켓의 경우 이 오류는 작업이 진행되는 동안 오류를 감지한 연결 유지 작업으로 인해 연결이 끊어졌는지 나타냅니다. 데이터그램 소켓의 경우 이 오류는 TTL(Time to Live)이 만료되었음을 나타냅니다. | |
소켓이 연결되지 않았습니다. | |
설명자가 소켓이 아닙니다. | |
MSG_OOB 지정되었지만 소켓이 SOCK_STREAM 형식과 같은 스트림 스타일이 아니거나, OOB 데이터가 이 소켓과 연결된 통신 도메인에서 지원되지 않거나, 소켓이 단방향이며 보내기 작업만 지원합니다. | |
소켓이 종료되었습니다. SD_RECEIVE 또는 SD_BOTH 설정된 방법을 사용하여 종료가 호출된 후에는 소켓에서 WSARecv를 호출할 수 없습니다. | |
네트워크 오류로 인해 또는 피어 시스템이 응답하지 않기 때문에 연결이 삭제되었습니다. | |
Windows NT: 겹치는 소켓: 겹치는 미해결 I/O 요청이 너무 많습니다. 오버랩되지 않은 소켓: 소켓이 차단 해제로 표시되고 수신 작업을 즉시 완료할 수 없습니다. |
|
이 함수를 사용하기 전에 성공적인 WSAStartup 호출이 발생해야 합니다. | |
겹치는 작업이 성공적으로 시작되었으며 나중에 완료가 표시됩니다. | |
소켓의 닫기로 인해 겹치는 작업이 취소되었습니다. |
설명
WSARecv 함수는 세 가지 중요한 영역에서 표준 recv 함수와 비교하여 몇 가지 추가 기능을 제공합니다.
- 겹치는 소켓과 함께 사용하여 겹치는 사각형 작업을 수행할 수 있습니다.
- 이를 통해 여러 수신 버퍼를 지정하여 I/O의 분산/수집 형식에 적용할 수 있습니다.
- lpFlags 매개 변수는 입력에서 모두 사용되며 출력에서 반환되므로 애플리케이션이 MSG_PARTIAL 플래그 비트의 출력 상태를 감지할 수 있습니다. 그러나 MSG_PARTIAL 플래그 비트는 모든 프로토콜에서 지원되지 않습니다.
연결된 연결 없는 소켓의 경우 이 함수는 수신된 메시지가 허용되는 주소를 제한합니다. 함수는 연결에 지정된 원격 주소의 메시지만 반환합니다. 다른 주소의 메시지는 (자동으로) 삭제됩니다.
겹치는 소켓의 경우 WSARecv 는 들어오는 데이터를 사용할 수 있게 될 때 배치되는 하나 이상의 버퍼를 게시하는 데 사용되며, 그 후에는 애플리케이션에서 지정한 완료 표시(완료 루틴 호출 또는 이벤트 개체 설정)가 발생합니다. 작업이 즉시 완료되지 않으면 완료 루틴 또는 WSAGetOverlappedResult를 통해 최종 완료 상태 검색됩니다.
오버랩되지 않은 소켓의 경우 차단 의미 체계는 표준 recv 함수의 의미 체계와 동일하며 lpOverlapped 및 lpCompletionRoutine 매개 변수는 무시됩니다. 전송에 의해 이미 수신되고 버퍼링된 모든 데이터는 지정된 사용자 버퍼에 복사됩니다. 현재 전송에 의해 수신되고 버퍼링된 데이터가 없는 차단 소켓의 경우 데이터가 수신될 때까지 호출이 차단됩니다. Windows 소켓 2는 이 함수에 대한 표준 차단 제한 시간 메커니즘을 정의하지 않습니다. 바이트 스트림 프로토콜 역할을 하는 프로토콜의 경우 스택은 사용 가능한 버퍼 공간 및 사용 가능한 수신된 데이터의 양에 따라 가능한 한 많은 데이터를 반환하려고 시도합니다. 그러나 단일 바이트를 수신하면 호출자의 차단을 해제하기에 충분합니다. 둘 이상의 바이트가 반환된다는 보장은 없습니다. 메시지 지향적 역할을 하는 프로토콜의 경우 호출자의 차단을 해제하려면 전체 메시지가 필요합니다.
XP1_MESSAGE_ORIENTED | XP1_PSEUDO_STREAM | MSG_PARTIAL | 다음으로 작동 |
---|---|---|---|
설정 안 됨 | * | * | 바이트 스트림 |
* | 설정 | * | 바이트 스트림 |
set | 설정 안 함 | set | 바이트 스트림 |
set | 설정 안 함 | 설정 안 됨 | 메시지 지향 |
버퍼는 lpBuffers가 가리키는 배열에 표시되는 순서대로 채워지고 버퍼는 구멍이 만들어지지 않도록 압축됩니다.
이 함수가 겹치는 방식으로 완료되면 이 호출에서 반환하기 전에 WSABUF 구조를 캡처하는 것은 Winsock 서비스 공급자의 책임입니다. 이를 통해 애플리케이션은 lpBuffers 매개 변수가 가리키는 스택 기반 WSABUF 배열을 빌드할 수 있습니다.
바이트 스트림 스타일 소켓(예: 형식 SOCK_STREAM)의 경우 버퍼가 채워지거나 연결이 닫히거나 내부적으로 버퍼링된 데이터가 소진될 때까지 들어오는 데이터가 버퍼에 배치됩니다. 들어오는 데이터가 모든 버퍼를 채우는지 여부에 관계없이 겹치는 소켓에 대한 완료 표시가 발생합니다.
메시지 지향 소켓(예: SOCK_DGRAM 입력)의 경우 들어오는 메시지가 버퍼의 총 크기까지 버퍼에 배치되고 겹치는 소켓에 대한 완료 표시가 발생합니다. 메시지가 버퍼보다 크면 버퍼가 메시지의 첫 번째 부분으로 채워집니다. 기본 서비스 공급자가 MSG_PARTIAL 기능을 지원하는 경우 MSG_PARTIAL 플래그는 lpFlags 로 설정되고 후속 수신 작업은 메시지의 나머지 부분을 검색합니다. MSG_PARTIAL 지원되지 않지만 프로토콜이 신뢰할 수 있는 경우 WSARecv는 WSAEMSGSIZE 오류를 생성하고 더 큰 버퍼를 사용하여 후속 수신 작업을 사용하여 전체 메시지를 검색할 수 있습니다. 그렇지 않으면(즉, 프로토콜이 신뢰할 수 없고 MSG_PARTIAL 지원하지 않음), 초과 데이터가 손실되고 WSARecv에서 WSAEMSGSIZE 오류가 발생합니다.
연결 지향 소켓의 경우 WSARecv 는 소켓이 바이트 스트림인지 메시지 지향인지에 따라 달라지는 두 가지 방법 중 하나로 가상 회로의 정상적인 종료를 나타낼 수 있습니다. 바이트 스트림의 경우 0바이트가 읽혀졌으며(성공을 나타내기 위해 반환 값이 0으로 표시되고 lpNumberOfBytesRecvd 값이 0으로 표시됨)은 정상적인 닫기를 나타내며 더 이상 바이트를 읽지 않습니다. 0바이트 메시지가 허용되는 메시지 지향 소켓의 경우 WSAEDISCON 오류 코드가 있는 오류가 정상적인 닫기를 나타내는 데 사용됩니다. 어떤 경우든 WSAECONNRESET 의 반환 오류 코드는 중단 닫기가 발생했음을 나타냅니다.
lpFlags 매개 변수를 사용하여 연결된 소켓에 대해 지정된 옵션 이외의 함수 호출 동작에 영향을 줄 수 있습니다. 즉, 이 함수의 의미 체계는 소켓 옵션 및 lpFlags 매개 변수에 의해 결정됩니다. 후자는 다음 표에 나열된 값과 함께 비트 OR 연산자를 사용하여 생성됩니다.
값 | 의미 |
---|---|
MSG_PEEK |
들어오는 데이터를 피킹합니다. 데이터는 버퍼에 복사되지만 입력 큐에서 제거되지 않습니다.
이 플래그는 오버랩되지 않은 소켓에만 유효합니다. |
MSG_OOB | OOB 데이터를 처리합니다. |
MSG_PARTIAL |
이 플래그는 메시지 지향 소켓 전용입니다. 출력에서 이 플래그는 지정된 데이터가 보낸 사람에서 전송하는 메시지의 일부임을 나타냅니다. 메시지의 나머지 부분은 후속 수신 작업에 지정됩니다. MSG_PARTIAL 플래그가 지워진 후속 수신 작업은 보낸 사람의 메시지 끝을 나타냅니다.
이 플래그는 입력 매개 변수로 전송 공급자가 메시지의 일부만 수신한 경우에도 수신 작업이 완료되어야 했음을 나타냅니다. |
MSG_PUSH_IMMEDIATE |
이 플래그는 스트림 지향 소켓 전용입니다. 이 플래그를 사용하면 스트림 소켓을 사용하여 전송 공급자에게 부분적으로 채워진 보류 중인 수신 요청의 완료를 지연시키지 않도록 지시하는 애플리케이션을 허용합니다. 이는 애플리케이션이 전송 중인 나머지 데이터를 반드시 기다리지 않고 가능한 한 빨리 들어오는 데이터를 수신할 의향이 있음을 전송 공급자에게 암시합니다. 부분적으로 채워진 보류 중인 수신 요청을 구성하는 것은 전송 관련 문제입니다.
TCP의 경우 들어오는 TCP 세그먼트가 수신 요청 데이터 버퍼에 배치되는 경우를 나타냅니다. 여기서 TCP 세그먼트 중 어느 것도 PUSH 비트 값이 1임을 나타내지 않았습니다. 이 경우 TCP는 부분적으로 채워진 수신 요청을 조금 더 길게 보유하여 푸시 비트가 1로 설정된 TCP 세그먼트로 데이터의 나머지 부분을 도착할 수 있도록 할 수 있습니다. 이 플래그는 수신 요청을 보유하지 않고 즉시 완료하도록 TCP에 지시합니다. 부분 블록 처리가 최적이 아닌 경우가 많으므로 큰 블록 전송에 이 플래그를 사용하지 않는 것이 좋습니다. 이 플래그는 부분 데이터를 즉시 받고 처리하는 것이 처리 대기 시간을 줄이는 데 도움이 되는 경우에만 유용합니다. 이 플래그는 실제 보장이 아닌 힌트입니다. 이 플래그는 Windows 8.1, Windows Server 2012 R2 이상에서 지원됩니다. |
MSG_WAITALL |
수신 요청은 다음 이벤트 중 하나가 발생하는 경우에만 완료됩니다.
기본 전송 공급자가 MSG_WAITALL 지원하지 않거나 소켓이 비차단 모드인 경우 이 호출은 WSAEOPNOTSUPP와 함께 실패합니다. 또한 MSG_WAITALL MSG_OOB,MSG_PEEK 또는 MSG_PARTIAL 함께 지정된 경우 WSAEOPNOTSUPP에서 이 호출이 실패합니다. 이 플래그는 데이터그램 소켓 또는 메시지 지향 소켓에서 지원되지 않습니다. |
메시지 지향 소켓의 경우 부분 메시지가 수신되면 MSG_PARTIAL 비트가 lpFlags 매개 변수에 설정됩니다. 전체 메시지가 수신되면 lpFlags에서 MSG_PARTIAL 지워집니다. 완료가 지연되는 경우 lpFlags 에서 가리키는 값은 업데이트되지 않습니다. 완료가 표시되면 애플리케이션은 WSAGetOverlappedResult를 호출하고 lpdwFlags 매개 변수로 표시된 플래그를 검사해야 합니다.
겹치는 소켓 I/O
겹치는 작업이 즉시 완료되면 WSARecv 는 값 0을 반환하고 lpNumberOfBytesRecvd 매개 변수는 수신된 바이트 수로 업데이트되고 lpFlags 매개 변수로 표시된 플래그 비트도 업데이트됩니다. 겹치는 작업이 성공적으로 시작되고 나중에 완료되면 WSARecv 는 SOCKET_ERROR 반환하고 오류 코드 WSA_IO_PENDING 나타냅니다. 이 경우 lpNumberOfBytesRecvd 및 lpFlags 는 업데이트되지 않습니다. 겹치는 작업이 완료되면 전송되는 데이터의 양은 완료 루틴의 cbTransferred 매개 변수를 통해 또는 WSAGetOverlappedResult의 lpcbTransfer 매개 변수를 통해 표시됩니다. 플래그 값은 WSAGetOverlappedResult의 lpdwFlags 매개 변수를 검사하여 가져옵니다.겹치는 I/O를 사용하는 WSARecv 함수는 이전 WSARecv, WSARecvFrom, WSASend 또는 WSASendTo 함수의 완료 루틴 내에서 호출할 수 있습니다. 지정된 소켓의 경우 I/O 완료 루틴은 중첩되지 않습니다. 이렇게 하면 시간에 민감한 데이터 전송이 선점 컨텍스트 내에서 완전히 발생할 수 있습니다.
lpOverlapped 매개 변수는 겹치는 작업 기간 동안 유효해야 합니다. 여러 I/O 작업이 동시에 실행되지 않는 경우 각각은 별도의 WSAOVERLAPPED 구조를 참조해야 합니다.
lpCompletionRoutine 매개 변수가 NULL이면 겹치는 작업이 완료될 때 lpOverlapped의 hEvent 매개 변수가 유효한 이벤트 개체 핸들을 포함하는 경우 신호를 보냅니다. 애플리케이션은 WSAWaitForMultipleEvents 또는 WSAGetOverlappedResult 를 사용하여 이벤트 개체를 기다리거나 폴링할 수 있습니다.
lpCompletionRoutine이 NULL이 아닌 경우 hEvent 매개 변수는 무시되며 애플리케이션에서 컨텍스트 정보를 완료 루틴에 전달하는 데 사용할 수 있습니다. NULL이 아닌 lpCompletionRoutine을 전달하고 나중에 동일한 겹치는 I/O 요청에 대해 WSAGetOverlappedResult를 호출하는 호출자는 WSAGetOverlappedResult 호출에 대한 fWait 매개 변수를 TRUE로 설정하지 않을 수 있습니다. 이 경우 hEvent 매개 변수의 사용이 정의되지 않았으며 hEvent 매개 변수를 대기하려고 하면 예측할 수 없는 결과가 생성됩니다.
완료 루틴은 Windows 파일 I/O 완료 루틴에 규정된 것과 동일한 규칙을 따릅니다. true로 설정된 fAlertable 매개 변수가 있는 함수 WSAWaitForMultipleEvents가 호출될 때와 같이 스레드가 경고 대기 상태에 있을 때까지 완료 루틴이 호출되지 않습니다.
완료 루틴의 프로토타입은 다음과 같습니다.
void CALLBACK CompletionROUTINE(
IN DWORD dwError,
IN DWORD cbTransferred,
IN LPWSAOVERLAPPED lpOverlapped,
IN DWORD dwFlags
);
CompletionRoutine은 애플리케이션 정의 또는 라이브러리 정의 함수 이름의 자리 표시자입니다. dwError는 lpOverlapped로 표시된 대로 겹치는 작업에 대한 완료 상태 지정합니다. cbTransferred 매개 변수는 수신된 바이트 수를 지정합니다. dwFlags 매개 변수에는 수신 작업이 즉시 완료된 경우 lpFlags에 표시되었을 정보가 포함됩니다. 이 함수는 값을 반환하지 않습니다.
이 함수에서 반환하면 이 소켓에 대해 보류 중인 다른 완료 루틴을 호출할 수 있습니다. WSAWaitForMultipleEvents를 사용하는 경우 경고 가능한 스레드의 대기가 반환 코드 WSA_IO_COMPLETION 충족되기 전에 모든 대기 완료 루틴이 호출됩니다. 완료 루틴은 겹치는 작업이 완료되는 순서와 같은 순서로 호출할 수 있는 것은 아닙니다. 그러나 게시된 버퍼는 지정된 순서와 동일한 순서로 채워지도록 보장됩니다.
I/O 완료 포트를 사용하는 경우 WSARecv 에 대한 호출 순서도 버퍼가 채워지는 순서입니다. WSARecv 는 예측할 수 없는 버퍼 순서를 초래할 수 있으므로 다른 스레드에서 동일한 소켓에서 동시에 호출해서는 안 됩니다.
예제 코드
다음 예제에서는 겹치는 I/O 모드에서 WSARecv 함수를 사용하는 방법을 보여 줍니다.#ifndef UNICODE
#define UNICODE
#endif
#ifndef WIN32_LEAN_AND_MEAN
#define WIN32_LEAN_AND_MEAN
#endif
#include <Windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
#include <stdlib.h>
// Need to link with Ws2_32.lib
#pragma comment(lib, "ws2_32.lib")
#pragma warning(disable: 4127) // Conditional expression is a constant
#define DATA_BUFSIZE 4096
int __cdecl main(int argc, char **argv)
{
WSADATA wsd;
struct addrinfo *result = NULL, *ptr = NULL, hints;
WSAOVERLAPPED RecvOverlapped;
SOCKET ConnSocket = INVALID_SOCKET;
WSABUF DataBuf;
DWORD RecvBytes, Flags;
char buffer[DATA_BUFSIZE];
int err = 0;
int rc;
if (argc != 2) {
wprintf(L"usage: %s server-name\n", argv[0]);
return 1;
}
// Load Winsock
rc = WSAStartup(MAKEWORD(2, 2), &wsd);
if (rc != 0) {
wprintf(L"Unable to load Winsock: %d\n", rc);
return 1;
}
// Make sure the hints struct is zeroed out
SecureZeroMemory((PVOID) & hints, sizeof (struct addrinfo));
// Initialize the hints to retrieve the server address for IPv4
hints.ai_family = AF_INET;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
rc = getaddrinfo(argv[1], "27015", &hints, &result);
if (rc != 0) {
wprintf(L"getaddrinfo failed with error: %d\n", rc);
return 1;
}
for (ptr = result; ptr != NULL; ptr = ptr->ai_next) {
ConnSocket = socket(ptr->ai_family, ptr->ai_socktype, ptr->ai_protocol);
if (ConnSocket == INVALID_SOCKET) {
wprintf(L"socket failed with error: %d\n", WSAGetLastError());
freeaddrinfo(result);
return 1;
}
rc = connect(ConnSocket, ptr->ai_addr, (int) ptr->ai_addrlen);
if (rc == SOCKET_ERROR) {
if (WSAECONNREFUSED == (err = WSAGetLastError())) {
closesocket(ConnSocket);
ConnSocket = INVALID_SOCKET;
continue;
}
wprintf(L"connect failed with error: %d\n", err);
freeaddrinfo(result);
closesocket(ConnSocket);
return 1;
}
break;
}
if (ConnSocket == INVALID_SOCKET) {
wprintf(L"Unable to establish connection with the server!\n");
freeaddrinfo(result);
return 1;
}
wprintf(L"Client connected...\n");
// Make sure the RecvOverlapped struct is zeroed out
SecureZeroMemory((PVOID) & RecvOverlapped, sizeof (WSAOVERLAPPED));
// Create an event handle and setup an overlapped structure.
RecvOverlapped.hEvent = WSACreateEvent();
if (RecvOverlapped.hEvent == NULL) {
wprintf(L"WSACreateEvent failed: %d\n", WSAGetLastError());
freeaddrinfo(result);
closesocket(ConnSocket);
return 1;
}
DataBuf.len = DATA_BUFSIZE;
DataBuf.buf = buffer;
// Call WSARecv until the peer closes the connection
// or until an error occurs
while (1) {
Flags = 0;
rc = WSARecv(ConnSocket, &DataBuf, 1, &RecvBytes, &Flags, &RecvOverlapped, NULL);
if ((rc == SOCKET_ERROR) && (WSA_IO_PENDING != (err = WSAGetLastError()))) {
wprintf(L"WSARecv failed with error: %d\n", err);
break;
}
rc = WSAWaitForMultipleEvents(1, &RecvOverlapped.hEvent, TRUE, INFINITE, TRUE);
if (rc == WSA_WAIT_FAILED) {
wprintf(L"WSAWaitForMultipleEvents failed with error: %d\n", WSAGetLastError());
break;
}
rc = WSAGetOverlappedResult(ConnSocket, &RecvOverlapped, &RecvBytes, FALSE, &Flags);
if (rc == FALSE) {
wprintf(L"WSARecv operation failed with error: %d\n", WSAGetLastError());
break;
}
wprintf(L"Read %d bytes\n", RecvBytes);
WSAResetEvent(RecvOverlapped.hEvent);
// If 0 bytes are received, the connection was closed
if (RecvBytes == 0)
break;
}
WSACloseEvent(RecvOverlapped.hEvent);
closesocket(ConnSocket);
freeaddrinfo(result);
WSACleanup();
return 0;
}
Windows Phone 8: 이 함수는 Windows Phone 8 이상에서 Windows Phone 스토어 앱에서 지원됩니다.
Windows 8.1 및 Windows Server 2012 R2: 이 함수는 Windows 8.1, Windows Server 2012 R2 이상의 Windows 스토어 앱에서 지원됩니다.
요구 사항
지원되는 최소 클라이언트 | Windows 8.1, Windows Vista [데스크톱 앱 | UWP 앱] |
지원되는 최소 서버 | Windows Server 2003 [데스크톱 앱 | UWP 앱] |
대상 플랫폼 | Windows |
헤더 | winsock2.h |
라이브러리 | Ws2_32.lib |
DLL | Ws2_32.dll |