《Windows网络与通信程序设计(第3版)》——第2章 Winsock编程接口2.1 Winsock库

简介:
+关注继续查看

本节书摘来自异步社区《Windows网络与通信程序设计(第3版)》一书中的第2章,第2.1节,作者: 陈香凝 , 王烨阳 , 陈婷婷 , 张铮 更多章节内容可以访问云栖社区“异步社区”公众号查看。

第2章 Winsock编程接口

Winsock是Windows下网络编程的标准接口,它允许两个或多个应用程序在相同机器上,或者是通过网络相互交流。Winsock是真正的协议无关的接口,本章主要讲述如何使用它来编写应用层的网络应用程序。

2.1 Winsock库

Winsock库有两个版本,Winsock1和Winsock2。现在开发网络应用程序都使用Winsock2,需要在程序中包含头文件winsock2.h,它包含了绝大部分socket函数和相关结构类型的声明和定义。同时要添加的还有到WS2_32.lib库的链接。包含必要的头文件,设置好链接环境之后,便可进行下面的编码工作了。

2.1.1 Winsock库的装入和释放
每个Winsock应用程序必须加载相应版本的Winsock DLL。如果在调用Winsock函数前没有加载Winsock库,函数返回SOCKET_ERROR,出错代码将是WSANOTINITIALISED。加载Winsock库的函数是WSAStartup,其定义如下。

int WSAStartup(
    WORD wVersionRequested,  // 指定想要加载的Winsock库的版本,高字节为次版本号,低字节为主版本号
    LPWSADATA lpWSAData  // 一个指向WSADATA结构的指针,用来返回DLL库的详细信息
);

wVersionRequested参数用来指定想要加载的Winsock库的版本。为了建立此参数的值,可以使用宏MAKEWORD(x, y),其中x是高字节,y是低字节。

lpWSAData是一个指向LPWSADATA结构的指针,WSAStartup使用所加载库的版本信息填充它。

typedef struct WSAData {
          WORD          wVersion;                                    // 库文件建议应用程序使用的版本
          WORD          wHighVersion;                                // 库文件支持的最高版本
          char             szDescription[WSADESCRIPTION_LEN+1];    // 库描述字符串
          char             szSystemStatus[WSASYS_STATUS_LEN+1];    // 系统状态字符串
          unsigned short   iMaxSockets;                                  // 同时支持的最大套接字的数量
          unsigned short   iMaxUdpDg;                                  // 2.0 版中已废弃的参数
          char FAR *      lpVendorInfo;                                 // 2.0 版中已废弃的参数
          } WSADATA, FAR * LPWSADATA;

函数调用成功返回0。否则要调用WSAGetLastError函数查看出错的原因。此函数的作用相当于API函数GetLastError,它取得最后发生错误的代码。

每一个对WSAStartup的调用必须对应一个对WSACleanup的调用,这个函数释放Winsock库。

int WSACleanup(void);

所有的Winsock函数都是从WS2_32.DLL导出的,VC++在默认情况下并没有链接到该库,如果想使用Winsock API,就必须包含相应的库文件。

#pragma comment(lib, "WS2_32")

2.1.2 封装CInitSock类
每次写网络程序都必须编写代码载入和释放Winsock库,为了今后讨论方便,这里封装一个CInitSock类来管理Winsock库,类的使用方法见下一小节。

#include <winsock2.h>                         // initsock.h文件
#pragma comment(lib, "WS2_32")               // 链接到WS2_32.lib
class CInitSock 
{
public:
          CInitSock(BYTE minorVer = 2, BYTE majorVer = 2)
          {         // 初始化WS2_32.dll
                     WSADATA wsaData;
                     WORD sockVersion = MAKEWORD(minorVer, majorVer);
                     if(::WSAStartup(sockVersion, &wsaData) != 0)
                     {        exit(0);                    }
          }
          ~CInitSock()
          {        ::WSACleanup();          }
};
相关文章
|
3月前
|
JSON 网络协议 Java
cpolar内网穿透将本地服务端接口模拟公共网络环境远程调用调试
cpolar内网穿透将本地服务端接口模拟公共网络环境远程调用调试
69 0
|
3月前
|
Windows
Windows基础命令(目录文件、文本、网络操作)
Windows基础命令(目录文件、文本、网络操作)
18 0
|
4月前
|
Windows
Qt在线安装时出现网络错误的解决办法(Windows)
Qt在线安装时出现网络错误的解决办法(Windows)
|
6月前
|
XML JSON 缓存
电商一站式管理后台必备工具:电商API接口,网络pachong、数据抓取、批量处理订单
电商一站式管理后台必备工具:电商API接口,网络pachong、数据抓取、批量处理订单
|
7月前
|
Windows
【Windows网络连接问题】无法连接到这个网络
【Windows网络连接问题】无法连接到这个网络
182 0
|
7月前
|
网络协议 安全 应用服务中间件
Windows活动目录以及部分Windows网络应用服务器
Windows活动目录以及部分Windows网络应用服务器
64 0
|
7月前
|
传感器 网络协议 网络架构
做网络那么多年,连以太网接口和串口都分不清?本文值得一看!
做网络那么多年,连以太网接口和串口都分不清?本文值得一看!
187 0
|
8月前
|
虚拟化 Windows
Windows win7下VMware Virtual Ethernet Adapter未识别网络解决方法
Windows win7下VMware Virtual Ethernet Adapter未识别网络解决方法
348 0
|
8月前
|
Windows Perl
网络基础 Windows下安装和配置net-snmp 代理
网络基础 Windows下安装和配置net-snmp 代理
526 0
|
8月前
|
Windows
网络基础 图解Windows系统下单网卡设置双IP访问不同网段的方法
网络基础 图解Windows系统下单网卡设置双IP访问不同网段的方法
527 0
相关产品
云迁移中心
推荐文章
更多