WSAStartup 함수(winsock.h)
WSAStartup 함수는 프로세스에서 Winsock DLL 사용을 시작합니다.
구문
int WSAStartup(
[in] WORD wVersionRequired,
[out] LPWSADATA lpWSAData
);
매개 변수
[in] wVersionRequired
호출자가 사용할 수 있는 가장 높은 버전의 Windows 소켓 사양입니다. 상위 바이트는 부 버전 번호를 지정합니다. 낮은 순서의 바이트는 주 버전 번호를 지정합니다.
[out] lpWSAData
Windows 소켓 구현의 세부 정보를 수신하는 WSADATA 데이터 구조에 대한 포인터입니다.
반환 값
성공하면 WSAStartup 함수는 0을 반환합니다. 그렇지 않으면 아래에 나열된 오류 코드 중 하나를 반환합니다.
WSAStartup 함수는 이 함수의 반환 값에서 확장된 오류 코드를 직접 반환합니다. WSAGetLastError 함수에 대한 호출은 필요하지 않으며 사용하면 안 됩니다.
오류 코드 | 의미 |
---|---|
기본 네트워크 하위 시스템은 네트워크 통신에 사용할 준비가 되지 않았습니다. | |
요청된 Windows 소켓 지원 버전은 이 특정 Windows 소켓 구현에서 제공되지 않습니다. | |
차단 Windows 소켓 1.1 작업이 진행 중입니다. | |
Windows 소켓 구현에서 지원하는 작업 수에 대한 제한에 도달했습니다. | |
lpWSAData 매개 변수가 유효한 포인터가 아닙니다. |
설명
WSAStartup 함수는 애플리케이션 또는 DLL에서 호출하는 첫 번째 Windows 소켓 함수여야 합니다. 애플리케이션 또는 DLL에서 필요한 Windows 소켓 버전을 지정하고 특정 Windows 소켓 구현의 세부 정보를 검색할 수 있습니다. 애플리케이션 또는 DLL은 WSAStartup을 성공적으로 호출한 후에만 추가 Windows 소켓 함수를 실행할 수 있습니다.
최신 버전의 Windows 소켓 사양과 기능적인 차이가 있을 수 있는 다양한 Windows 소켓 구현 및 애플리케이션을 지원하기 위해 WSAStartup에서 협상이 진행됩니다. WSAStartup의 호출자는 애플리케이션이 지원하는 Windows 소켓 사양의 가장 높은 버전인 wVersionRequested 매개 변수를 전달합니다. Winsock DLL은 응답에서 지원할 수 있는 가장 높은 버전의 Windows 소켓 사양을 나타냅니다. Winsock DLL은 호출자가 사용할 것으로 예상되는 Windows 소켓 사양 버전으로도 회신합니다.
애플리케이션 또는 DLL이 WSAStartup 함수를 호출하면 Winsock DLL은 wVersionRequested 매개 변수에 전달된 애플리케이션에서 요청한 Windows 소켓 사양의 버전을 검사합니다. 애플리케이션에서 요청한 버전이 Winsock DLL에서 지원하는 가장 낮은 버전보다 크거나 같으면 호출이 성공하고 Winsock DLL은 lpWSAData 매개 변수가 가리키는 WSADATA 구조체에 자세한 정보를 반환합니다. WSADATA 구조체의 wHighVersion 멤버는 Winsock DLL에서 지원하는 가장 높은 버전의 Windows 소켓 사양을 나타냅니다. WSADATA 구조체의 wVersion 멤버는 Winsock DLL에서 호출자가 사용할 것으로 예상되는 Windows 소켓 사양의 버전을 나타냅니다.
WSADATA 구조의 wVersion 멤버가 호출자에게 허용되지 않는 경우 애플리케이션 또는 DLL은 WSACleanup을 호출하여 Winsock DLL 리소스를 해제하고 Winsock 애플리케이션을 초기화하지 않아야 합니다. 이 애플리케이션 또는 DLL을 지원하려면 플랫폼에 설치할 업데이트된 버전의 Winsock DLL을 검색해야 합니다.
Windows 소켓 사양의 현재 버전은 버전 2.2입니다. 현재 Winsock DLL (Ws2_32.dll)은 다음 버전의 Windows 소켓 사양을 요청하는 애플리케이션을 지원합니다.
- 1.0
- 1.1
- 2.0
- 2.1
- 2.2
더 높은 버전의 Windows 소켓 사양의 새 구문에 대한 모든 권한을 얻으려면 애플리케이션이 이 상위 버전에 대해 협상해야 합니다. 이 경우 wVersionRequested 매개 변수는 버전 2.2를 요청하도록 설정해야 합니다. 또한 애플리케이션은 적절한 헤더 파일에 대한 컴파일, 새 라이브러리와의 연결 또는 기타 특수한 경우와 같이 더 높은 버전의 Windows 소켓 사양을 완전히 준수해야 합니다. Winsock 2 지원에 대한 Winsock2.h 헤더 파일은 Microsoft Windows SDK(소프트웨어 개발 키트)(SDK)에 포함되어 있습니다.
Windows 소켓 버전 2.2는 Windows Server 2008, Windows Vista, Windows Server 2003, Windows XP, Windows 2000, sp4(서비스 팩 4) 이상, Windows Me, Windows 98 및 Windows 95 OSR2를 사용하는 Windows NT 4.0에서 지원됩니다.
Windows 소켓 버전 2.2도 에서 지원됩니다.
Windows 소켓 2 업데이트가 있는 Windows 95. 이러한 플랫폼의 애플리케이션은 일반적으로 wVersionRequested 매개 변수를 적절하게 설정하여 Winsock 2.2를 요청해야 합니다.
Windows 95 및 Windows NT 3.51 이하 버전에서 Windows 소켓 버전 1.1은 지원되는 Windows 소켓 사양의 가장 높은 버전입니다.
애플리케이션 또는 DLL이 Winsock DLL에서 지원하는 더 낮은 버전의 Windows 소켓 사양을 사용하여 WSAStartup 함수를 사용하여 이 하위 버전을 성공적으로 협상할 수 있습니다. 예를 들어 애플리케이션은 Winsock 2.2 DLL을 사용하여 플랫폼의 WSAStartup 함수에 전달된 wVersionRequested 매개 변수에서 버전 1.1을 요청할 수 있습니다. 이 경우 애플리케이션은 요청된 버전에 맞는 기능만 사용해야 합니다. 새 Ioctl 코드, 기존 함수의 새로운 동작 및 새 함수를 사용하면 안 됩니다. WSAStartup에서 제공하는 버전 협상은 주로 Windows 95 및 Windows NT 3.51 이하용으로 개발된 이전 Winsock 1.1 애플리케이션이 이후 버전의 Windows에서 동일한 동작으로 실행되도록 하는 데 사용되었습니다. Winsock 1.1 지원에 대한 Winsock.h 헤더 파일은 Windows SDK 포함되어 있습니다.
WSAStartup 함수에서 이 협상을 통해 Windows 소켓과 Winsock DLL을 사용하는 애플리케이션 또는 DLL이 모두 다양한 Windows 소켓 버전을 지원할 수 있습니다. 버전 범위가 겹치는 경우 애플리케이션 또는 DLL에서 Winsock DLL을 사용할 수 있습니다. Windows 소켓 구현에 대한 자세한 내용은 WSAStartup 함수에서 반환된 WSADATA 구조체에 제공됩니다.
다음 표에서는 WSAStartup 이 다양한 애플리케이션 및 Winsock DLL 버전에서 작동하는 방법을 보여 줍니다.
호출자 버전 지원 | Winsock DLL 버전 지원 | wVersion 요청됨 | wVersion 이 반환됨 | wHighVersion 반환 | 최종 결과 |
---|---|---|---|---|---|
1.1 | 1.1 | 1.1 | 1.1 | 1.1 | 1.1 사용 |
1.0 1.1 | 1.0 | 1.1 | 1.0 | 1.0 | 1.0 사용 |
1.0 | 1.0 1.1 | 1.0 | 1.0 | 1.1 | 1.0 사용 |
1.1 | 1.0 1.1 | 1.1 | 1.1 | 1.1 | 1.1 사용 |
1.1 | 1.0 | 1.1 | 1.0 | 1.0 | 애플리케이션 실패 |
1.0 | 1.1 | 1.0 | — | — | WSAVERNOTSUPPORTED |
1.0 1.1 | 1.0 1.1 | 1.1 | 1.1 | 1.1 | 1.1 사용 |
1.1 2.0 | 1.0 1.1 | 2.0 | 1.1 | 1.1 | 1.1 사용 |
2.0 | 1.0 1.1 2.0 | 2.0 | 2.0 | 2.0 | 2.0 사용 |
2.0 2.2 | 1.0 1.1 2.0 | 2.2 | 2.0 | 2.0 | 2.0 사용 |
2.2 | 1.0 1.1 2.0 2.1 2.2 | 2.2 | 2.2 | 2.2 | use 2.2 |
애플리케이션 또는 DLL이 WSAStartup 호출에 성공하면 필요에 따라 다른 Windows 소켓 호출을 진행할 수 있습니다. Winsock DLL의 서비스 사용이 완료되면 애플리케이션은 WSACleanup 을 호출하여 Winsock DLL이 애플리케이션에서 사용하는 내부 Winsock 리소스를 해제할 수 있도록 해야 합니다.
애플리케이션은 WSADATA 구조 정보를 두 번 이상 가져와야 하는 경우 WSAStartup을 두 번 이상 호출할 수 있습니다. 이러한 각 호출에서 애플리케이션은 Winsock DLL에서 지원하는 버전 번호를 지정할 수 있습니다.
WSAStartup 함수는 일반적으로 프로토콜별 도우미 DLL이 로드됩니다. 따라서 애플리케이션 DLL의 DllMain 함수에서 WSAStartup 함수를 호출하면 안 됩니다. 이로 인해 교착 상태가 발생할 수 있습니다. 자세한 내용은 DLL Main 함수를 참조하세요.
애플리케이션은 WSAStartup 함수를 호출할 때마다 WSACleanup 함수를 호출해야 합니다. 예를 들어 애플리케이션이 WSAStartup 을 세 번 호출하는 경우 WSACleanup 을 세 번 호출해야 합니다. WSACleanup에 대한 처음 두 호출은 내부 카운터를 감소하는 것 외에는 아무 작업도 수행하지 않습니다. 태스크에 대한 최종 WSACleanup 호출은 작업에 필요한 모든 리소스 할당을 수행합니다.
Windows Phone 8: 이 함수는 Windows Phone 8 이상에서 Windows Phone 스토어 앱에서 지원됩니다.
Windows 8.1 및 Windows Server 2012 R2: 이 함수는 Windows 8.1, Windows Server 2012 R2 이상에서 Windows 스토어 앱에서 지원됩니다.
예제
다음 코드 조각은 Windows 소켓 버전 2.2만 지원하는 애플리케이션이 WSAStartup 호출을 만드는 방법을 보여 줍니다.
#define WIN32_LEAN_AND_MEAN
#include <windows.h>
#include <winsock2.h>
#include <ws2tcpip.h>
#include <stdio.h>
// Need to link with Ws2_32.lib
#pragma comment(lib, "ws2_32.lib")
int __cdecl main()
{
WORD wVersionRequested;
WSADATA wsaData;
int err;
/* Use the MAKEWORD(lowbyte, highbyte) macro declared in Windef.h */
wVersionRequested = MAKEWORD(2, 2);
err = WSAStartup(wVersionRequested, &wsaData);
if (err != 0) {
/* Tell the user that we could not find a usable */
/* Winsock DLL. */
printf("WSAStartup failed with error: %d\n", err);
return 1;
}
/* Confirm that the WinSock DLL supports 2.2.*/
/* Note that if the DLL supports versions greater */
/* than 2.2 in addition to 2.2, it will still return */
/* 2.2 in wVersion since that is the version we */
/* requested. */
if (LOBYTE(wsaData.wVersion) != 2 || HIBYTE(wsaData.wVersion) != 2) {
/* Tell the user that we could not find a usable */
/* WinSock DLL. */
printf("Could not find a usable version of Winsock.dll\n");
WSACleanup();
return 1;
}
else
printf("The Winsock 2.2 dll was found okay\n");
/* The Winsock DLL is acceptable. Proceed to use it. */
/* Add network programming using Winsock here */
/* then call WSACleanup when done using the Winsock dll */
WSACleanup();
}
요구 사항
요구 사항 | 값 |
---|---|
지원되는 최소 클라이언트 | Windows 8.1, Windows Vista [데스크톱 앱 | UWP 앱] |
지원되는 최소 서버 | Windows Server 2003 [데스크톱 앱 | UWP 앱] |
대상 플랫폼 | Windows |
헤더 | winsock.h(Winsock2.h 포함) |
라이브러리 | Ws2_32.lib |
DLL | Ws2_32.dll |