首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >WSAStartup函数是如何启动使用Winsock DLL的?

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

Stack Overflow用户
提问于 2011-02-14 12:07:16
回答 1查看 27.4K关注 0票数 15

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

根据文件

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

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

例如,在这段代码中,

代码语言:javascript
复制
#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细节的呢?

谢谢。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2011-02-14 14:12:46

WSAStartup有两个主要目的。

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

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

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

票数 22
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4991967

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档