这里用通俗的语言解释一下这个函数,就类似于opencv一样,要添加链接库函数,cv.lib等,要添加到附加依赖项,或者通过#pragma comment(lib,”cv.lib“)一样,然后才能包含头文件进行各种函数的调用。当然了,socket编程要调用各种socket函数,但是需要库Ws2_32.lib和头文件Winsock2.h,这里的WSAStartup就是为了向操作系统说明,我们要用哪个库文件,让该库文件与当前的应用程序绑定,从而就可以调用该版本的socket的各种函数了

头文件 header:  Winsock2.h

库library:      Ws2_32.lib
原型:int   PASCAL   FAR  WSAStartup ( WORD  wVersionRequested, LPWSADATA   lpWSAData );
参数:

wVersionRequested是Windows Sockets API提供的调用方可使用的最高版本号。高位字节指出副版本(修正)号,低位字节指明主版本号。
lpWSAData 是指向WSADATA数据结构的指针,用来接收Windows Sockets实现的细节。

WSADATA数据类型:这个结构被用来存储 被WSAStartup函数调用后返回的 Windows Sockets数据。它包含Winsock.dll执行的数据。

结构原型:  

struct WSAData {WORD wVersion;WORD wHighVersion;char szDescription[WSADESCRIPTION_LEN+1];char szSystemStatus[WSASYSSTATUS_LEN+1];unsigned short iMaxSockets;unsigned short iMaxUdpDg;char *lpVendorInfo;
};

WSADATA结构被用来保存函数WSAStartup返回的Windows Sockets初始化信息。

成员:

  wVersion

  Windows Sockets DLL期望调用者使用的Windows Sockets规范的版本。 高位字节存储副版本号,低位字节存储主版本号,可以用WORD MAKEWORD(BYTE,BYTE ) 返回这个值,例如:MAKEWORD(1,1)

  wHighVersion

  这个DLL能够支持的Windows Sockets规范的最高版本。通常它与wVersion相同。

  szDescription

  以null结尾的ASCII字符串,Windows Sockets DLL将对Windows Sockets实现的描述拷贝到这个字符串中,包括制造商标识。文本(最多可以有256个字符)可以包含任何字符,但是要注意不能包含控制字符和格式字符,应用程序对其最可能的使用方式是把它(可能被截断)显示在在状态信息中。

  szSystemStatus

  以null结尾的ASCII字符串,Windows Sockets DLL把有关的状态或配置信息拷贝到该字符串中。Windows Sockets DLL应当仅在这些信息对用户或支持人员有用时才使用它们,它不应被作为szDescription域的扩展。

  iMaxSockets

  单个进程能够打开的socket的最大数目。Windows Sockets的实现能提供一个全局的socket池,可以为任何进程分配;或者它也可以为socket分配属于进程的资源。这个数字能够很好地反映Windows Sockets DLL或网络软件的配置方式。应用程序的编写者可以通过这个数字来粗略地指明Windows Sockets的实现方式对应用程序是否有用。例如,X Windows服务器在第一次启动的时候可能会检查iMaxSockets的值:如果这个值小于8,应用程序将显示一条错误信息,指示用户重新配置网络软件(这是一种可能要使用szSystemStatus文本的场合)。显然无法保证某个应用程序能够真正分配iMaxSockets个socket,因为可能有其它WindowsSockets应用程序正在使用。

  iMaxUdpDg Windows Sockets应用程序能够发送或接收的最大的用户数据包协议(UDP)的数据包大小,以字节为单位。如果实现方式没有限制,那么iMaxUdpDg为零。在Berkeley sockets的许多实现中,对于UDP数据包有个固有的限制(在必要时被分解),大小为8192字节。Windows Sockets的实现可以对碎片重组缓冲区的分配作出限制。对于适合的WindowsSockets 实现,iMaxUdpDg的最小值为512。注意不管iMaxUdpDg的值是什么,都不推荐你发回一个比网络的最大传送单元(MTU)还大的广播数据包。(Windows Sockets API 没有提供发现MTU的机制,但是它不会小于512个字节)。WinSock2.0版中已被废弃。

  lpVendorInfo 指向销售商的数据结构的指针。这个结构的定义(如果有)超出了WindowsSockets规范的范围。WinSock2.0版中已被废弃。

介绍

WSAStartup,即WSA(Windows Sockets Asynchronous,Windows异步套接字)的启动命令。是Windows下的网络编程接口软件Winsock1 或 Winsock2 里面的一个命令(Ps:Winsock 是由Unix下的BSD Socket发展而来,是一个与网络协议无关的编程接口)。

WSAStartup必须是应用程序或DLL调用的第一个Windows Sockets函数。它允许应用程序或DLL指明Windows Sockets API的版本号及获得特定Windows Sockets实现的细节。应用程序或DLL只能在一次成功的WSAStartup()调用之后才能调用进一步的Windows Sockets API函数。

int WSAStartup( WORD wVersionRequested, LPWSADATA lpWSAData);

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

函数定义

int WSAStartup ( WORD wVersionRequested, LPWSADATA lpWSAData );

⑴ wVersionRequested:一个WORD(双字节)型数值,在最高版本的Windows Sockets支持调用者使用,高阶字节指定小版本(修订本)号,低位字节指定主版本号。

⑵lpWSAData 指向WSADATA数据结构的指针,用来接收Windows Sockets实现的细节。

WindowsSockets API提供的调用方可使用的最高版本号。高位字节指出副版本(修正)号,低位字节指明主版本号。

注释

为支持日后可能和Windows Sockets 1.1有功能上差异的Windows Sockets实现及应用程序,在WSAStartup()中规定了一个协议。WSAStartup()的调用方和Windows Sockets DLL互相通知对方它们可以支持的最高版本,并且互相确认对方的最高版本是可接受的。在WSAStartup()函数的入口,Windows Sockets DLL检查了应用程序所需的版本。如果程序所需Sockets版本等于或高于DLL支持的最低版本(MSDN: If the version requested by the application is equal to or higher than the lowest version supported by the Winsock DLL, the call succeeds and...),则调用成功并且DLL在wHighVersion中返回它所支持的最高版本,在wVersion中返回它的高版本和wVersionRequested中的较小者。然后Windows Sockets DLL就会假设应用程序将使用wVersion。如果WSDATA结构中的wVersion域对调用方来说不可接收,它就应调用WSACleanup()函数并且要么去另一个Windows Sockets DLL中搜索,要么初始化失败。

本协议允许Windows Sockets DLL和Windows Sockets应用程序共同支持一定范围的Windows Sockets版本。如果版本范围有重叠,应用程序就可以成功地使用Windows Sockets DLL。下列的图表给出了WSAStartup()在不同的应用程序和Windows Sockets DLL版本中是如何工作的:

应用程序版本     DLL版本        wVersionRequested        wVersion          wHighVersion     最终结果

1.1                       1.1                  1.1                                     1.1                     1.1                        use 1.1

1.0 、1.1            1.0                  1.1                                     1.0                     1.0                         use 1.0

1.0                       1.0、1.1        1.0                                     1.0                     1.1                         use 1.0

1.1                       1.0、1.1        1.1                                     1.1                     1.1                         use 1.1

1.1                       1.0                  1.1                                     1.0                     1.0                         失败

1.0                       1.1                  1.0                                     --                     --                          WSAVERNOTSUPPORTED

1.0、1.1             1.0、1.1         1.1                                     1.1                     1.1                         use 1.1

1.1、2.0             1.1                   2.0                                    1.1                     1.1                         use 1.1

2.0                       1.1                   2.0                                    1.1                     1.1                         失败

下列代码段给出了只支持Windows Sockets 1.1版本的应用程序是如何进行WSAStartup()调用的:

WORD wVersionRequested;
WSADATA wsaData;
int err;
wVersionRequested =MAKEWORD( 1, 1 );
err = WSAStartup( wVersionRequested, &wsaData );
if ( err != 0 ) {
/* Tell the user that we couldn't find a useable */
/* winsock.dll. */
return;
}
/* Confirm that the Windows Sockets DLL supports 1.1.*/
/* Note that if the DLL supports versions greater */
/* than 1.1 in addition to 1.1, it will still return */
/* 1.1 in wVersion since that is the version we */
/* requested. */
if ( LOBYTE( wsaData.wVersion ) != 1 ||
HIBYTE( wsaData.wVersion ) != 1 ) {
/* Tell the user that we couldn't find a useable */
/* winsock.dll. */
WSACleanup( );
return;
}
/* The Windows Sockets DLL is acceptable. Proceed. */

下面的代码段示例了只支持1.1版的Windows Sockets DLL是如何进行WSAStartup()协商的:

/* Make sure that the version requested is >= 1.1. */
/* The low byte is the major version and the high */
/* byte is the minor version. */
if ( LOBYTE( wVersionRequested ) < 1 ||
( LOBYTE( wVersionRequested ) == 1 &&
HIBYTE( wVersionRequested ) < 1 ) {
return WSAVERNOTSUPPORTED;
}
/* Since we only support 1.1, set both wVersion and */
/* wHighVersion to 1.1. */
lpWsaData->wVersion = MAKEWORD( 1, 1 );
lpWsaData->wHighVersion = MAKEWORD( 1, 1 );

一旦应用程序或DLL进行了一次成功的WSAStartup()调用,它就可以继续进行其它所需的Windows Sockets API调用。当它完成了使用该Windows Sockets DLL的服务后,应用程序或DLL必须调用WSACleanup()以允许Windows Sockets DLL释放任何该应用程序的资源。

实际的Windows Sockets实现细节在WSAData结构中描述如下:

struct WSAData {
WORD wVersion;
WORD wHighVersion;
char szDescription[WSADESCRIPTION_LEN+1];
char szSystemStatus[WSASYSSTATUS_LEN+1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char FAR * lpVendorInfo;
};

返回值

0 成功。

否则返回下列的错误代码之一。注意通常依靠应用程序调用WSAGetLastError()机制获得的错误代码是不能使用的,因为Windows Sockets DLL可能没有建立“上一错误”信息储存的客户数据区域。

关于Windows Sockets提供者的说明:

每一个Windows Sockets应用程序必须在进行其它Windows Sockets API调用前进行WSAStartup()调用。这样,本函数就可以用于初始化的目的。

进一步的说明在WSACleanup()的说明中有讨论。

错误代码

WSASYSNOTREADY 代码数值为10091,指出网络通信依赖的网络子系统还没有准备好。

WSAVERNOTSUPPORTED 代码数值为10092,表示所需的Windows Sockets API的版本未由特定的Windows Sockets实现提供。

WSAEINVAL 代码数值为10022,说明应用程序指出的Windows Sockets版本不被该DLL支持。

WSAEINPROGRESS 代码数值为10036,说明一个阻塞的Winsock调用正在进行中。

WSAEPROCLIM 代码数值为10067,说明已经达到了Windows Sockets实现所支持的任务数量的极限。

WSAEFAULT 代码数值为10014,说明lpWSADATA参数是一个无效的指针。

在Windows下,Socket是以DLL的形式实现的。在DLL内部维持着一个计数器,只有第一次调用WSAStartup才真正装载DLL,以后的 调用只是简单的增加计数器,而WSACleanup函数的功能则刚好相反,每调用一次使计数器减1,当计数器减到0时,DLL就从内存中被卸载!因此,你 调用了多少次WSAStartup,就应相应的调用多少次的WSACleanup. 

WSAStartup相关推荐

  1. WSAStartup函数

    函数WSAStartup 一.WSAStartup函数                 int WSAStartup                        (                  ...

  2. 【Android 逆向】Android 逆向通用工具开发 ( 网络模块开发 | 配置头文件 | 配置编译参数 | 网络初始化 WSAStartup 与清理 WSACleanup 操作 )

    文章目录 前言 一.开发前的配置 ( 头文件 | 编译参数设置 ) 二.网络初始化 WSAStartup 与清理 WSACleanup 操作 前言 本篇博客重点分析 CNetwork 网络模块 ; 一 ...

  3. WSAStartup()函数以及DLL的加载

    本节讲解 Windows 下 DLL 的加载,学习 Linux Socket 的读者可以跳过. WinSock(Windows Socket)编程依赖于系统提供的动态链接库(DLL),有两个版本: 较 ...

  4. Eclipse c++ 中[Linker error] undefined reference to `WSAStartup@8'的解决办法

    今天搭建了一个Eclipse+MinGW的C++开发环境,Eclipse的使用就是方便. 于是,就写了一个socket程序,MinGW支持winsock2,但到编译的时候总是报错: undefined ...

  5. mingw linux socket,MingW上编译WinSocket程序undefined reference to `WSAStartup@8'报错的解决办法...

    在Mingw stdio上编译Windows Socket程序经常出现这样的错误 undefined reference to `inet_addr@4' undefined reference to ...

  6. 「 C++ 函数 」“WSAStartup()使用”讲解

    一.前言 当我们进行socket编程时,要调用各种socket函数,而且还需要用到一个库文件 Ws2_32.lib 和一个头文件 Winsock2.h. 二.讲解 1. 函数的功能 WSAStartu ...

  7. 【网络通信】WSAStartup()函数,MAKEWORD的使用

    函数的使用 int main() {WSADATA wsa; //初始化网络环境if(WSAStartup(MAKEWORD(2,2),&wsa)!=0) //使用2.2版本的Socket.{ ...

  8. winSocket第一步WSAStartup

    写了很多socket了,很少关注socket的第一步 #define WIN32_LEAN_AND_MEAN#include <windows.h> #include <winsoc ...

  9. C语言startup()函数,WSAStartup()函数以及DLL的加载

    本节讲解 Windows 下 DLL 的加载,学习 Linux Socket 的读者可以跳过. WinSock(Windows Socket)编程依赖于系统提供的动态链接库(DLL),有两个版本: 较 ...

  10. WSAStartup( )详解

    这里用通俗的语言解释一下这个函数,就类似于opencv一样,要添加链接库函数,cv.lib等,要添加到附加依赖项,或者通过#pragma comment(lib,"cv.lib") ...

最新文章

  1. HDU2988(Kruskal算法模版)
  2. 武汉科技大学ACM :1004: C语言程序设计教程(第三版)课后习题6.3
  3. Opengl-几何着色器(劫持顶点的家伙)
  4. 在目标检测被“遗忘”领域进行探索后,百度开源最新力作UMOP:即插即用、无痛涨点
  5. linux 统计_聊聊 Linux 的内存统计
  6. 数据预处理 泰坦尼克号_了解泰坦尼克号数据集的数据预处理
  7. 如何在 macOS 中使用选项卡?
  8. pycharm:修改项目的python版本
  9. javaScript入门
  10. 计算机诗人 原理,写诗软件
  11. 华为研发工程师编程题:汽水瓶 [python]
  12. PS for Mac 破解版下载
  13. 生产环境突然编译报错:‘XXXX‘ is not defined no-undef
  14. 成都中医药大学计算机基础试题,成都中医药大学2016年春季学期期末考试计算机基础-成教()解剖.doc...
  15. 计算机网络中的层次结构
  16. 探索 TDengine在《图码联侦》项目中的应用可行性及实践研究(new)
  17. Day04 - Array Cardio 指南一
  18. ShaderLearning_1_理论渲染管线和GPU渲染管线
  19. 商品国标码的SQLSERVER SQL 校验位 实现:
  20. 学计算机设计制图需啥基础,学CAD制图需要什么软件

热门文章

  1. 1588. 所有奇数长度子数组的和
  2. Android P图形架构之三屏异显实现
  3. 聚类分析在用户行为中的实例_网站用户行为分析案例
  4. 菜鸟第一次wp项目总结
  5. java aviator_Aviator——让表达式飞起来
  6. 实验6 在应用程序中播放音频和视频
  7. 测试—数据库性能测试
  8. MyBase7定期破解
  9. Flutter 基础组件之 Text
  10. C语言编程题:相似三角形(sdut oj)