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后再次将其删除。