1.3 基于Windows平台的套接字实现
Windows
的套接字大部分是参考BSD
系列UNIX
套接字设计的,因此和Linux
相似。因此只需要修改一部分网络程序内容,就可以将Linux
的程序放到Windows
去运行。
同时学习Linux和Windows的原因
大部分项目是在Linux
部署的服务器端,大多数的客户端又是在Windows
下开发的。因此学习网络编程需要兼顾Windows
和Linux
平台。
设置头文件和库
#include <winsock2.h>
链接ws2_32.lib
库
以VS2022为例,点击项目,最下面的属性,然后选择连接器,选择输入,附加依赖项中添加ws2_32.lib
Winsock的初始化
#include <winsock2.h>
int WSAStartup(
WORD wVersionRequested,//Winscok的版本信息
LPWSADATA lpWSAData//WSADATA结构体变量的地址值
);
对于第一个参数:Winsock
存在多个版本,所以需要传入版本信息(WORD
是通过typedef
定义的unsigned short
类型)。若版本是1.2,则其中1是主版本号,2是副版本号,需要传入0x0201
。即高八位为副版本号,低八位为主版本号。同时可以借助MAKEWORD()
。
MAKEWORD(1,2);// return 0x0201
MAKEWORD(2,2);// return 0x0202
对于第二个参数:此参数中需要传入WSADATA
型结构体变量地址,LPWSADATA
是该类型的指针类型,调用完函数后,相应参数中将填充已初始化的库信息。虽然没有特殊含义,但是为了调用函数,必须传递WSADATA
结构体变量地址。
int main (int argc, char* argv[])
{
WSADATA wsaData;
/****************/
if(WSAStartup(MAKEWORD(2, 2), &wsaData) != 0)
ErrorHanding();
/****************/
return 0;
}
使用下方函数即可注销该库
#include <winsock2.h>
int WSACleanup(void);//成功返回0,否则SOCKET_ERROR
注意,调用后将无法再次调用Winsock
相关函数。通常在程序结束前调用。