wsastartup函数如何启动winsock dll的使用?
根据文件
wsastartup函数必须是
第一个windows sockets函数调用
通过应用程序或dll。它允许
应用程序或dll来指定
需要Windows套接字的版本
并检索特定
Windows套接字实现。这个
应用程序或dll只能发出
其他Windows套接字功能
在成功调用wsastartup之后。
此函数初始化WSADATA数据结构,但在socket编程中,我们不会将WSDATA传递给任何函数,因此程序如何了解windows sockets版本和其他详细信息?
例如在这段代码中

#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()数据结构,在wards之后,我不会将wsaData传递到任何地方。
那么我的程序是如何知道wsaData细节的呢?
谢谢。

最佳答案

wsastartup有两个主要目的。
首先,它允许您指定要使用的winsock版本(您在示例中请求的是2.2)。在它填充的wsadata中,它将根据您的请求告诉您它提供的版本。它还填充了一些其他信息,如果您不感兴趣,则不需要查看这些信息。您再也不必将此wsadata结构提交给winsock,因为它纯粹用于为您的wsastartup请求提供反馈。
它所做的第二件事,就是设置应用程序需要使用套接字的所有“幕后工作”。winsock dll文件被加载到您的进程中,并且它有很多需要为每个进程设置的内部结构。这些结构对您是隐藏的,但它们对您进行的每个winsock调用都是可见的。
由于需要为使用winsock的每个进程设置这些结构,因此每个进程必须调用wsastartup来初始化其自身内存空间中的结构,并且wsacleanup在使用完sockets后再次将其删除。

10-08 09:44