上一节我们介绍了客户端与服务端相互通信的模型图,每一步都有具体的函数实现,但需要明白的是,使用这些函数之前,在Windows系统下,需要先调用WSAStartup函数进行必要的初始化,才可以顺利的进行,

而使用WSAStartup函数又需要事先包含对应的头文件winsock2.h及静态库ws2_32.lib文件(在windows环境下)

具体如下:


函数功能:

用于初始化Socket编程,指明Windows系统中Socket( )版本

依赖静态库库:

ws2_32.lib

需要用#pragma命令包含,即:

#pragma comment(lib,"ws2_32.lib")    //表示链接Ws2_32.lib这个库。ws2_32.lib是Winsock2的库文件。

函数原型:

int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);

返回值类型:

整型 

返回值:

成功返回0,失败返回-1

参数说明:

第一个参数wVersionRequested为 WinSock 规范的版本号它的类型WORD,所以要用MAKEWORD( )宏函数对它的版本号进行转换。低字节为主版本号,高字节为副版本号。

代码示例:

wVersionRequired=MAKEWORD(1,2)   //即主版本号是1,副版本号位2,那么它表示的就是调用WinSock 1.2版本。     现在我们一般用2.2版本 ,即MAKEWORD(1,2)

                     

第二个参数lpWSAData 为指向 WSAData 结构体的指针。其定义原型如下:

typedef struct WSAData {
	WORD		wVersion;    //ws2_32.dll 建议我们使用的版本号
	WORD		wHighVersion;    //ws2_32.dll 支持的最高版本号
#ifdef _WIN64
	unsigned short	iMaxSockets;     //2.0以后不再使用
	unsigned short	iMaxUdpDg;     //2.0以后不再使用
	char		*lpVendorInfo;     //2.0以后不再使用
	char		szDescription[WSADESCRIPTION_LEN+1];  //一个以 null 结尾的字符串,用来说明 ws2_32.dll 的实现以及厂商信息
	char		szSystemStatus[WSASYS_STATUS_LEN+1];  //一个以 null 结尾的字符串,用来说明 ws2_32.dll 的状态以及配置信息
#else
	char		szDescription[WSADESCRIPTION_LEN+1];   //32位版本,同上
	char		szSystemStatus[WSASYS_STATUS_LEN+1];   //32位版本,同上
	unsigned short	iMaxSockets;    //32位版本,同上
	unsigned short	iMaxUdpDg;    //32位版本,同上
	char		*lpVendorInfo;    32位版本,同上
#endif
} WSADATA, *LPWSADATA;


怎么样,看清楚真实面貌了吧,因此我们只需要包含头文件、静态库,然后完善这两个参数,传入WSAStartup调用即可。

当然,完整可编译的代码,则需要将以上代码放入main函数中,并且包含对应的头文件及相对应的静态库,使用方式如下:

//www.dotcpp.com
#include <stdio.h>
#include <winsock2.h>
#pragma comment (lib, "ws2_32.lib")

int main()
{
WSADATA wsaData;
WSAStartup( MAKEWORD(2, 2), &wsaData); //目前建议使用最新2.2版本

//以下为测试信息,打印相应的数值用于测试
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;
}


WSAStartup示例


大家可以实行上机试验。


在介绍完WSAStartup函数后我们就要按顺序讲解socket( )、bind( )、listen( )、accept( )、recv( )、send( )、closesocket( )这些函数了。


点赞(0)

C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:

一点编程也不会写的:零基础C语言学练课程

解决困扰你多年的C语言疑难杂症特性的C语言进阶课程

从零到写出一个爬虫的Python编程课程

只会语法写不出代码?手把手带你写100个编程真题的编程百练课程

信息学奥赛或C++选手的 必学C++课程

蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程

手把手讲解近五年真题的蓝桥杯辅导课程

Dotcpp在线编译      (登录可减少运行等待时间)