gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 16:34:01 25 4
gpt4 key购买 nike

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

根据文档

The WSAStartup function must be the first Windows Sockets function called by an application or DLL. It allows an application or DLL to specify the version of Windows Sockets required and retrieve details of the specific Windows Sockets implementation. The application or DLL can only issue further Windows Sockets functions after successfully calling 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");
}

在此示例中,我使用 WSAStartup() 函数初始化 WSADATA 数据结构,之后我不会在任何地方传递 wsaData

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

谢谢。

最佳答案

WSAStartup 有两个主要目的。

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

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

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

关于c - WSAStartup 函数如何启动 Winsock DLL 的使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4991967/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com