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

Sea*_*ock 15 c winapi network-programming winsock wsastartup

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

根据文件

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

这个函数初始化WSADATA数据结构,但在socket编程,我们不传递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");
}
Run Code Online (Sandbox Code Playgroud)

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

那么我的程序如何了解wsaData细节呢?

谢谢.

Gav*_*ock 17

WSAStartup有两个主要目的.

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

它做的第二件事是设置你的应用程序需要使用套接字的所有"幕后工作".WinSock DLL文件被加载到您的进程中,它有很多内部结构需要为每个进程设置.这些结构对您来说是隐藏的,但是您对每个WinSock调用都可以看到它们.

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

  • @Gavin,那么为什么Windows需要启动却没有nix环境就可以启动呢? (2认同)