2011-02-14 3 views
11

WSAStartup 함수는 Winsock DLL의 사용을 어떻게 시작합니까? 문서WSAStartup 함수는 Winsock DLL의 사용을 어떻게 시작합니까?

을 WSAStartup 기능은 응용 프로그램이나 DLL에 의해 라는 첫 번째 Windows 소켓 기능을해야합니다에 따르면

. 응용 프로그램 또는 DLL이 버전의 Windows 소켓을 지정하고 을 지정하고 특정 Windows 소켓 구현의 세부 정보를 검색 할 수 있습니다. 응용 프로그램 또는 DLL은 WSAStartup을 성공적으로 호출 한 후에 이상의 Windows 소켓 기능 만 발급 할 수 있습니다.

이 기능은 WSADATA 데이터 구조를 초기화하지만, 소켓 프로그래밍에서 우리는 어떻게 프로그램이 Windows 소켓 버전 및 기타 세부 사항에 대해 알고 온다 않는 기능에 WSDATA을 통과하지? 이 예에서이 코드

#include <stdio.h> 
#include <winsock2.h> 
#pragma comment(lib, "ws2_32") 

void Run(int argc, char* argv[]) 
{ 
    char* host = argc < 2 ? "" : argv[1]; 
    struct hostent* entry = gethostbyname(host); 

    if(entry) 
    { 
     struct in_addr* addr = (struct in_addr*) entry->h_addr; 
     printf("IP Address: %s\n", inet_ntoa(*addr)); 
    } 
    else 
     printf("ERROR: Resolution failure.\n"); 
} 

int main(int argc, char* argv[]) 
{ 
    WSADATA wsaData; 

    if(WSAStartup(0x202, &wsaData) == 0) 
    { 
     Run(argc, argv); 
     WSACleanup(); 
    } 
    else 
     printf("ERROR: Initialization failure.\n"); 
} 

에서

예를 들어

나는 WSAStartup() 기능을 사용하여 WSADATA 데이터 구조를 초기화하고 와드 후 난 아무 wsaData를 전달하고 있지 않다.

내 프로그램에서 wsaData 세부 정보를 어떻게 알 수 있습니까?

감사합니다.

답변

14

WSAStartup에는 크게 두 가지 목적이 있습니다.

먼저, 사용하려는 WinSock 버전을 지정합니다 (예를 들어 2.2를 요구하고 있음). 채워지는 WSADATA에서 요청에 따라 어떤 버전을 제공하는지 알려줍니다. 그것은 또한 다른 정보를 채 웁니다 당신이 관심이없는 경우 보지 않아도됩니다. 순전히 WSAStartup 요청에 대한 피드백을 제공하기 위해이 WSADATA 구조체를 WinSock에 다시 제출할 필요가 없습니다.

두 번째로하는 일은 앱에서 소켓을 사용해야하는 모든 "뒤에서하는 일"을 설정하는 것입니다. WinSock DLL 파일은 프로세스에로드되며 각 프로세스에 대해 설정해야하는 내부 구조가 많이 있습니다. 이러한 구조는 숨겨져 있지만 WinSock 호출마다 볼 수 있습니다.

WinSock을 사용하는 각 프로세스에 대해 이러한 구조를 설정해야하기 때문에 각 프로세스는 WSAStartup을 호출하여 자체 메모리 공간에서 구조를 초기화해야하며 WSACleanup은 소켓 사용이 끝나면 다시 끊어집니다.

+1

또한 다음 링크를 참조하십시오. http://stackoverflow.com/questions/1869689/is-it-possible-to-tell-if-wsastartup-has-been-called-in-a-process on a previous 질문 나는 자기 발견을 통해 대답을 물었고 발견했다. – Matt

+0

설명해 주셔서 감사합니다. – Searock

+0

@Matt H 추가 정보를 제공해 주셔서 감사합니다. – Searock

관련 문제