WSAStartup()函数以及DLL的加载
本节解说 Windows 下 DLL 的加载,进修 Linux Socket 的读者可以跳过。
WinSock(Windows Socket)编程依附于零碎供给的静态链接库(DLL),有两个版本:
较早的DLL是 wsock32.dll,巨细为 28KB,对应的头文件为 winsock1.h;
最新的DLL是 ws2_32.dll,巨细为 69KB,对应的头文件为 winsock2.h。
简直一切的 Windows 操作零碎都曾经支撑 ws2_32.dll,包含团体操作零碎 Windows 95 OSR2、Windows 98、Windows Me、Windows 2000、XP、Vista、Win7、Win8、Win10 以及效劳器操作零碎 Windows NT 4.0 SP4、Windows Server 2003、Windows Server 2008 等,所以你可以毫不犹疑地运用最新的 ws2_32.dll。
运用DLL之前必需把DLL加载到以后程序,你可以在编译时加载,也可以在程序运转时加载,《C言语初级教程》中讲到了这两种加载方法,请猛击:静态链接库DLL的加载:隐式加载(载入时加载)和显式加载(运转时加载)。
这里运用#pragma敕令,在编译时加载:
#pragma comment (lib, "ws2_32.lib")
WSAStartup() 函数
运用DLL之前,还需求挪用 WSAStartup() 函数停止初始化,以指明 WinSock 标准的版本,它的原型为:
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
wVersionRequested 为 WinSock 标准的版本号,低字节为主版本号,高字节为副版本号(修改版本号);lpWSAData 为指向 WSAData 构造体的指针。
关于 WinSock 标准
WinSock 标准的最新版本号为 2.2,较早的有 2.1、2.0、1.1、1.0,ws2_32.dll 支撑一切的标准,而 wsock32.dll 仅支撑 1.0 和 1.1。
wsock32.dll 曾经可以很好的支撑 TCP/IP 通讯程序的开辟,ws2_32.dll 次要添加了对其他协定的支撑,不外建议运用最新的 2.2 版本。
wVersionRequested 参数用来指明我们愿望运用的版本号,它的类型为 WORD,等价于 unsigned short,是一个整数,所以需求用 MAKEWORD() 宏函数对版本号停止转换。例如:
MAKEWORD(1, 2); //主版本号为1,副版本号为2,前往 0x0201 MAKEWORD(2, 2); //主版本号为2,副版本号为2,前往 0x0202
关于 WSAData 构造体
WSAStartup() 函数履行胜利后,会将与 ws2_32.dll 有关的信息写入 WSAData 构造体变量。WSAData 的界说如下:
typedef struct WSAData { WORD wVersion; //ws2_32.dll 建议我们运用的版本号 WORD wHighVersion; //ws2_32.dll 支撑的最高版本号 //一个以 null 开头的字符串,用来阐明 ws2_32.dll 的完成以及厂商信息 char szDescription[WSADESCRIPTION_LEN+1]; //一个以 null 开头的字符串,用来阐明 ws2_32.dll 的形态以及设置装备摆设信息 char szSystemStatus[WSASYS_STATUS_LEN+1]; unsigned short iMaxSockets; //2.0今后不再运用 unsigned short iMaxUdpDg; //2.0今后不再运用 char FAR *lpVendorInfo; //2.0今后不再运用 } WSADATA, *LPWSADATA;
最初3个成员已弃之不必,szDescription 和 szSystemStatus 包括的信息根本没有适用价值,读者只需存眷前两个成员即可。请看下面的代码:
#include <stdio.h> #include <winsock2.h> #pragma comment (lib, "ws2_32.lib") int main(){ WSADATA wsaData; WSAStartup( MAKEWORD(2, 2), &wsaData); printf("wVersion: %d.%d\n", LOBYTE(wsaData.wVersion), HIBYTE(wsaData.wVersion)); printf("wHighVersion: %d.%d\n", LOBYTE(wsaData.wHighVersion), HIBYTE(wsaData.wHighVersion)); printf("szDescription: %s\n", wsaData.szDescription); printf("szSystemStatus: %s\n", wsaData.szSystemStatus); return 0; }
运转后果:
wVersion: 2.2
wHighVersion: 2.2
szDescription: WinSock 2.0
szSystemStatus: Running
ws2_32.dll 支撑的最高版本为 2.2,建议运用的版本也是 2.2。
综上所述:WinSock 编程的第一步就是加载 ws2_32.dll,然后挪用 WSAStartup() 函数停止初始化,并指明要运用的版本号。
转载于:https://blog.51cto.com/12009752/1843745
上一篇: Delphi中加载dll,exe的路径
下一篇: 解决同名dll冲突的问题
推荐阅读
-
【ASP.NET】1.ASP.NET页面事件加载顺序以及Global.asax文件的使用
-
php中关于魔法函数以及魔法常量的使用详解
-
JavaScript中全局变量、函数内变量以及常量表达式的效率测试_javascript技巧
-
mysql 导入导出数据库以及函数、存储过程的介绍_MySQL
-
探讨Smarty中如何获取数组的长度以及smarty调用php函数的详解_PHP教程
-
JS脚本加载后执行相应回调函数的操作方法
-
用js进行url编码后用php反解以及用php实现js的escape功能函数总
-
spl_autoload()函数的作用以及其和spl_autoload_register()的关系?
-
将DLL放入到资源中,运行时自动加载的小例子
-
解析Java和Eclipse中加载本地库(.dll文件)的详细说明