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

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

根据文件

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

这个函数初始化WSADATA数据结构,但是在套接字编程中我们不会将WSDATA传递给任何函数,那么程序如何了解Windows套接字版本和其他细节呢?

例如,在此代码中

 #include  #include  #pragma comment(lib, "ws2_32") void Run(int argc, char* argv[]) { char* host = argc 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在完成使用套接字时再次将它们拆除。