《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();          }
};
相关文章
|
15天前
|
安全 Java 数据处理
Python网络编程基础(Socket编程)多线程/多进程服务器编程
【4月更文挑战第11天】在网络编程中,随着客户端数量的增加,服务器的处理能力成为了一个重要的考量因素。为了处理多个客户端的并发请求,我们通常需要采用多线程或多进程的方式。在本章中,我们将探讨多线程/多进程服务器编程的概念,并通过一个多线程服务器的示例来演示其实现。
|
1月前
|
安全 网络安全 网络虚拟化
【软件设计师备考 专题 】常用网络设备和各类通信设备(一)
【软件设计师备考 专题 】常用网络设备和各类通信设备
97 2
|
1月前
ifconfig 配置网络接口
ifconfig 配置网络接口。
18 1
|
1月前
|
域名解析 网络协议 Linux
【Shell 命令集合 网络通讯 】Linux 设置和管理网络接口配置信息 netconfig命令 使用指南
【Shell 命令集合 网络通讯 】Linux 设置和管理网络接口配置信息 netconfig命令 使用指南
56 1
|
17天前
|
网络协议 Linux
在Linux中,管理和配置网络接口
在Linux中管理网络接口涉及多个命令,如`ifconfig`(在新版本中被`ip`取代)、`ip`(用于网络设备配置)、`nmcli`(NetworkManager的CLI工具)、`nmtui`(文本界面配置)、`route/ip route`(处理路由表)、`netstat/ss`(显示网络状态)和`hostnamectl/systemctl`(主机名和服务管理)。这些命令帮助用户启动接口、设置IP地址、查看连接和路由信息。不同发行版可能有差异,建议参考相应文档。
19 4
|
1月前
|
监控 网络协议 Linux
【Shell 命令集合 网络通讯 】Linux 显示网络 连接、路由表和网络接口信息 netstat命令 使用指南
【Shell 命令集合 网络通讯 】Linux 显示网络 连接、路由表和网络接口信息 netstat命令 使用指南
62 1
|
1天前
|
API C++ Windows
windows编程入门_链接错误的配置
windows编程入门_链接错误的配置
7 0
|
2天前
|
存储 网络协议 关系型数据库
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
Python从入门到精通:2.3.2数据库操作与网络编程——学习socket编程,实现简单的TCP/UDP通信
|
4天前
|
Ubuntu 网络协议 Linux
Linux(20) Ubuntu 20.04 网络接口自动切换路由配置
Linux(20) Ubuntu 20.04 网络接口自动切换路由配置
27 0
|
11天前
|
SQL 安全 Java
Java安全编程:防范网络攻击与漏洞
【4月更文挑战第15天】本文强调了Java安全编程的重要性,包括提高系统安全性、降低维护成本和提升用户体验。针对网络攻击和漏洞,提出了防范措施:使用PreparedStatement防SQL注入,过滤和转义用户输入抵御XSS攻击,添加令牌对抗CSRF,限制文件上传类型和大小以防止恶意文件,避免原生序列化并确保数据完整性。及时更新和修复漏洞是关键。程序员应遵循安全编程规范,保障系统安全。