WSAStartup函数是如何启动使用Winsock DLL的?
根据文件
WSAStartup函数必须是应用程序或DLL调用的第一个WSAStartup套接字函数。它允许应用程序或DLL指定所需Windows套接字的版本,并检索特定Windows套接字实现的详细信息。应用程序或DLL只能在成功调用WSAStartup后发出进一步的Windows函数。
这个函数初始化WSADATA数据结构,但是在套接字编程中我们不会将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");
}在本例中,我使用WSADATA函数初始化WSAStartup()数据结构,而在wards之后,我不会将wsaData传递到任何地方。
那么,我的程序是如何了解wsaData细节的呢?
谢谢。
发布于 2011-02-14 14:12:46
WSAStartup有两个主要目的。
首先,它允许您指定要使用的WinSock版本(在示例中请求2.2 )。在它所填充的WSADATA中,它将根据您的请求告诉您它提供的版本。它还填写了一些其他信息,如果您不感兴趣,则不需要查看这些信息。您不必再次向WinSock提交此WSADATA结构,因为它纯粹用于向您提供有关WSAStartup请求的反馈。
它所做的第二件事是设置应用程序使用套接字所需的所有“幕后的东西”。WinSock DLL文件被加载到您的进程中,并且它有许多需要为每个进程设置的内部结构。这些结构对您来说是隐藏的,但是它们对您发出的每个WinSock调用都是可见的。
因为需要为每个使用WinSock的进程设置这些结构,所以每个进程都必须调用WSAStartup来初始化自己的内存空间内的结构,并在使用套接字完成时调用WSACleanup来再次删除它们。
https://stackoverflow.com/questions/4991967
复制相似问题