Windows网络编程 WSAstartup()详解

socket编程要调用各种socket函数,但是需要库Ws2_32.lib和头文件Winsock2.h,这里的WSAStartup就是为了向操作系统说明,我们要用哪个库文件,让该库文件与当前的应用程序绑定,从而就可以调用该版本的socket的各种函数了。

#include<WinSock2.h> //第2版本的网络库
#pragma comment(lib,"ws2_32.lib") //windows 32位版本的,没有64版本的,但是64位下也有32位版本的

详细说明

为了在 应用程序当中调用任何一个Winsock API 函数,首先第一件事情就是必须通过WSAStartup 函数完成对Winsock服务的初始化,因此需要调用WSAStartup 函数。使用Socket的程序在使用Socket之前必须调用WSAStartup函数。该 函数的第一个参数指明程序请求使用的Socket版本,其中高位 字节指明副版本、低位字节指明主版本; 操作系统利用第二个参数返回请求的Socket的版本信息。当一个 应用程序调用WSAStartup 函数时, 操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后 应用程序就可以调用所请求的Socket库中的其它Socket 函数了。

函数原型

int
WSAAPI
WSAStartup(
    _In_ WORD wVersionRequested,
    _Out_ LPWSADATA lpWSAData
    );

使用方法:

当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中。以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。

参数说明:

wVersionRequired:
这是一个我们需要的网络库版本号
lpWSAData:
这是一个WSADATA的指针。WSADATA是一个结构体, WSAStartup()函数会将环境的网络库信息存在这个结构体中。

typedef struct WSAData {
        WORD                    wVersion;
        WORD                    wHighVersion;
#ifdef _WIN64
        unsigned short          iMaxSockets;
        unsigned short          iMaxUdpDg;
        char FAR *              lpVendorInfo;
        char                    szDescription[WSADESCRIPTION_LEN+1];
        char                    szSystemStatus[WSASYS_STATUS_LEN+1];
#else
        char                    szDescription[WSADESCRIPTION_LEN+1];
        char                    szSystemStatus[WSASYS_STATUS_LEN+1];
        unsigned short          iMaxSockets;
        unsigned short          iMaxUdpDg;
        char FAR *              lpVendorInfo;
#endif
} WSADATA, FAR * LPWSADATA;

返回值:

如果函数正确,那么将会返回0,如果错误将会返回错误的代号,具体错类类型可以参考官网。

使用范例:

#include <iostream>
#include <WinSock2.h>//添加头文件
#pragma comment(lib, "ws2_32.lib")//连接库(这种连接库的方式与在编程设置中链接库的功能是一致的)

int main()
{
    WORD wdVersion = MAKEWORD(2, 2);//定义自己需要的网络库版本,这里是2.2

    WSADATA wdSockMsg;//这是一个结构体

    int nRes = WSAStartup(wdVersion, &wdSockMsg);//打开一个套接字

    if (0 != nRes)
    {
        switch (nRes)
        {
            case WSASYSNOTREADY: printf("重启电脑,或者检查网络库");   break;
            case WSAVERNOTSUPPORTED: printf("请更新网络库");  break;
            case WSAEINPROGRESS: printf("请重新启动");  break;
            case WSAEPROCLIM:  printf("请关闭不必要的软件,以确保有足够的网络资源"); break;
        }
    }

    if (2 != HIBYTE(wdSockMsg.wVersion) || 2 != LOBYTE(wdSockMsg.wVersion))
    {
        printf("网络库版本错误");
        WSACleanup();//关闭此套接字
        return 0;
    }
    
    std::cout << "Hello World!\n";
    return 0;

参考资料:

《Windows网络编程和程序设计》

  • 8
    点赞
  • 37
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值