15

WSAStartup 函数如何启动 Winsock DLL 的使用?

根据文档

WSAStartup 函数必须是应用程序或 DLL 调用的第一个 Windows 套接字函数。它允许应用程序或 DLL 指定所需的 Windows 套接字版本并检索特定 Windows 套接字实现的详细信息。应用程序或 DLL 只能在成功调用 WSAStartup 后发出进一步的 Windows Sockets 函数。

该函数初始化WSADATA数据结构,但在套接字编程中我们不传递WSDATA给任何函数,那么程序如何知道 Windows 套接字版本和其他细节?

例如在这段代码中

#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");
}

在这个例子中,我正在WSADATA使用函数初始化数据结构WSAStartup(),之后我没有通过wsaData任何地方。

那么我的程序是如何知道wsaData细节的呢?

谢谢。

4

1 回答 1

21

WSAStartup 有两个主要目的。

首先,它允许您指定要使用的 WinSock 版本(您在示例中请求 2.2)。在它填充的 WSADATA 中,它将根据您的请求告诉您它为您提供的版本。它还填写了一些其他信息,如果您不感兴趣,则不需要查看。您永远不必再次将此 WSADATA 结构提交给 WinSock,因为它纯粹用于向您提供有关您的 WSAStartup 请求的反馈。

它所做的第二件事是设置您的应用程序需要使用套接字的所有“幕后东西”。WinSock DLL 文件被加载到您的进程中,并且它具有需要为每个进程设置的大量内部结构。这些结构对您隐藏,但对您进行的每个 WinSock 调用都是可见的。

因为需要为使用 WinSock 的每个进程设置这些结构,所以每个进程必须调用 WSAStartup 以在其自己的内存空间中初始化这些结构,并在使用完套接字后再次调用 WSACleanup 将它们拆除。

于 2011-02-14T14:12:46.027 回答