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

第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();          }
};
时间: 2025-01-31 05:52:14

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

《Windows网络与通信程序设计(第3版)》——1.4 网络应用程序设计基础

1.4 网络应用程序设计基础 本节讲述网络应用程序设计的原则和网络程序开发环境的设置. 1.4.1 网络程序体系结构在创建网络应用程序之前,首先要决定应用程序的体系结构.应用程序体系结构(application architecture)由应用程序开发者设计,它指定了在各种各样的终端系统上,应用程序是如何组织的.本节介绍现有的主要体系结构:客户机/服务器体系结构.P2P体系结构和这两种结构的混合. 1.客户机/服务器体系结构在客户机/服务器体系结构中,有一个总是在运行的主机,称为服务器,它为来自

《Windows网络与通信程序设计(第3版)》——1.2 计算机网络参考模型

1.2 计算机网络参考模型 了解网络的相关概念之后,本节将讨论计算机网络中主机之间是如何进行通信的,以及各种通信协议之间的关系等. 1.2.1 协议层次为了降低设计难度,大部分网络都以层(layer或level)的形式组织在一起,每一层都建立在它的下层之上,使用它的下层提供的服务,下层对它的上层隐藏了服务实现的细节.这种方法几乎应用于整个计算机科学领域,也可以称为信息隐藏.数据类型抽象.数据封装.面向对象编程等. 一个机器上的第n层和另一个机器的第n层交流,所使用的规则和协定合起来称为第n层协议

《Windows网络与通信程序设计(第3版)》——2.3 Winsock编程详解

2.3 Winsock编程详解 使用TCP创建网络应用程序稍微复杂一些,因为TCP是面向连接的协议,需要通信双方首先建立一个连接.本节先以建立简单的TCP客户端和服务器端应用程序为例,详细说明Winsock的编程流程,然后再介绍较为简单的UDP编程. 2.3.1 Winsock编程流程 使用Winsock编程的一般步骤是比较固定的,可以结合后面的例子程序来理解它们. 1.套接字的创建和关闭 使用套接字之前,必须调用socket函数创建一个套接字对象,此函数调用成功将返回套接字句柄. SOCKET

《Windows网络与通信程序设计(第3版)》——2.2 Winsock的寻址方式和字节顺序

2.2 Winsock的寻址方式和字节顺序 本节讲述在Winsock中主机地址信息的表示方法,以及相关的操作函数. 2.2.1 Winsock寻址 因为Winsock要兼容多个协议,所以必须使用通用的寻址方式.TCP/IP使用IP地址和端口号来指定一个地址,但是其他协议也许采用不同的形式.如果Winsock强迫使用特定的寻址方式,添加其他协议就不大可能了.Winsock的第一个版本使用sockaddr结构来解决此问题. struct sockaddr { u_short sa_family; c

《Windows网络与通信程序设计(第3版)》——第1章 计算机网络基础1.1 网络的概念和网络的组成

第1章 计算机网络基础 本章详细讲述网络程序设计中要用到的计算机网络方面的基础知识,包括各种网络术语.网络硬件设备.网络拓扑结构.网络协议等. 1.1 网络的概念和网络的组成 网络是各种连在一起的可以相互通信的设备的集合.本书讲述的网络是最常见的,将数亿计算机连接到一起的Internet.下面通过讲述组成Internet的基本硬件和软件来进一步明确计算机网络的概念. Internet是世界范围内的计算机网络,它不仅连接了PC.存储和传输信息的服务器,还连接了PDA.电视.移动PC等.所有的这些设

《Windows网络与通信程序设计(第3版)》——2.4 网络对时程序实例

2.4 网络对时程序实例 网络对时也就是从Internet上获得准确的时间,以此来校对本地计算机时钟.通过这样一个实例程序,大家可以初步了解协议和Winsock函数的具体应用. ** 2.4.1 时间协议(Time Protocol)** Time Protocol (RFC-868)是一种非常简单的应用层协议.它返回一个未格式化的32位二进制数字,这个数字描述了从1900年1月1日午夜到现在的秒数.服务器在端口37监听时间协议请求,以TCP/IP或者UDP/IP格式返回响应.将服务器的返回值转

《Windows网络与通信程序设计(第3版)》——1.3 网络程序寻址方式

1.3 网络程序寻址方式 编写网络程序,必须要有一种机制来标识通信的双方.本节详细讨论Internet中各层的寻址方式,以及相关的寻址协议. 1.3.1 MAC地址网络通信的最边缘便是LAN了,我们先来看看在LAN中是如何寻址的. 1.MAC子层和MAC地址LAN主要使用广播通信.在其内部,许多主机连在相同的通信通道上,通信时的关键问题是当竞争存在时如何决定谁使用通道.解决此问题的协议属于链路层的子层,称为MAC(Medium Access Control,介质访问控制)子层.MAC子层在LAN

《OSPF网络设计解决方案(第2版)》一1.11 本章总结

1.11 本章总结 OSPF网络设计解决方案(第2版)本章既介绍了网络及路由的基础概要,同时也对相关的基本原理进行了简介.所有类型的网络都需要这些基础信息的支持.本章首先介绍了建立在OSI参考模型上的网络结构,然后在此基础上,提出了TCP/IP协议簇:事实上,该协议簇已经成为Internet的通信标准. 在IP编址的讨论中,本章概述了地址的分类.同时介绍了一些常用技术,从而能够更好地管理IP地址:子网掩码.VLSM和CIDR.另外,本章还涉及了网络物理层的相关介绍.除此以外,本章从物理层的基础出

《OSPF网络设计解决方案(第2版)》一1.5 网络拓扑类型

1.5 网络拓扑类型 OSPF网络设计解决方案(第2版)本章开篇讨论了当今大型网络的发展历程,以及网络层次化的必要性,随后引出OSI参考模型和TCP/IP协议簇.在OSI参考模型一节中,本章介绍了几乎所有互联网络设备都应当遵循的OSI层面和数据传输的基本方法.在TCP/IP协议簇一节中,我们回顾了该协议簇的基本特点.本节将讨论连接各种网络的网络介质,并对LAN和WAN的拓扑进行回顾. 1.5.1 局域网 LAN(局域网)通常用于连接工作站.服务器.保留系统1及各种网络接入设备,正是这些相互连通的