上一节我们介绍了客户端与服务端相互通信的模型图,每一步都有具体的函数实现,但需要明白的是,使用这些函数之前,在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函数后我们就要按顺序讲解socket( )、bind( )、listen( )、accept( )、recv( )、send( )、closesocket( )这些函数了。
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程