正文
1.3 基于Windows平台的实现
win套接字简称 Winsock
1.3.1 同时学习Linux和Windows目的
两者其实差异不大
1.3.2 为Windows套接字编程设置头文件和库
作者用的是codeblocks 只需要在编译器-》链接器设置中添加
E:\CodeBlocks\MinGW\lib\libws2_32.a(libws2_32这个库就ok啦,位置因人而异~)
1.3.3 Winsock的初始化
首先必须调用WSAStartup函数,设置程序中用到的Winsick版本,并初始化相应版本的库
#include <winsock2.h>
// wVersionRequested:程序员要用的Winsock版本信息 ;
// lpWSAData:WSADATA结构体变量的地址值
int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);
成功返回0,失败返回非零的错误代码值
上方函数参数的说明:
有必要给出上述两个参数的详细说明。
先说第一个, Winsock 中存在多个版本,应准备WORD类型
(WORD
是通过 typedef
声明定义的 unsigned short
类型)的套接字版本信息,并传递给该函数的第一个参数 wVersionRequested
。若版本为1.2,则其中1是主版本号,2是副版本号,应传递
0x0201。
如前所述,高8位为副版本号,低8位为主版本号,以此进行传递。主要使用22版本
故应传递0x0202。不过,以字节为单位手动构造版本信息有些麻烦,借助 MAKEWORD
宏函数则
能轻松构建WORD
型版本信息。
MAKEWORD(1,2); //主版本为1 副版本为2 返回0x0201
MAKEWORD(2,2); //主版本为2 副版本为2 返回0x0202
再说第二个参数lpWSADATA
这个参数需要传入 WSADATA
型结构体变量地址(LPWSADATA
是WSADATA的指针类型)
地址中填充已初始化的库信息。 下面的调用过程是 Winsock编程的公式
int main(int argc, char* argv[])
{
WSADATA wsaData;
......
if(WSAStartup(MAKEWORD(2,2),&wsaData) != 0){
ErrorHandling("WSAStartup() error!");
}
......
return 0;
}
前面介绍了Winsock相关库的初始化方法,接下来是如何注销该库————利用下面的函数(WASCleanup(void))
#include <winsock2.h>
int WSACleanup(void);
成功时返回0,失败时返回SOCKET_ERROR
具体的实践过程见下一节内容1.4