本节书摘来自异步社区《Windows网络与通信程序设计(第3版)》一书中的第1章,第1.4节,作者: 陈香凝 , 王烨阳 , 陈婷婷 , 张铮 更多章节内容可以访问云栖社区“异步社区”公众号查看。
1.4 网络应用程序设计基础
本节讲述网络应用程序设计的原则和网络程序开发环境的设置。
1.4.1 网络程序体系结构
在创建网络应用程序之前,首先要决定应用程序的体系结构。应用程序体系结构(application architecture)由应用程序开发者设计,它指定了在各种各样的终端系统上,应用程序是如何组织的。本节介绍现有的主要体系结构:客户机/服务器体系结构、P2P体系结构和这两种结构的混合。
1.客户机/服务器体系结构
在客户机/服务器体系结构中,有一个总是在运行的主机,称为服务器,它为来自其他许多称为客户的主机提供服务。客户主机可以随时打开和关闭。最通俗的例子就是Web应用程序:Web服务器总是打开的,等待客户端程序(如IE浏览器)的请求,通过向它们发送网页数据响应这些请求。客户机/服务器体系结构有如下两个特点:
(1)客户端程序之间并不直接交流信息,它们仅与服务器通信。
(2)服务器方有一个固定的、公开的地址,称为IP地址(后面要讨论)。
服务器有固定的地址,而且总是打开的,所以客户端程序才能通过向服务器地址发送封包与之进行通信。
2.P2P(Peer-to-Peer,点对点)体系结构
单纯的P2P体系结构中,不再有总是运行的服务器了,任意的两台主机对(称为peer)都可以直接相互通信。因为peer之间可以不经过特定的服务器通信,所以这个体系结构称为peer-to-peer,简写为P2P。在P2P结构中,不再需要任何机器总是打开的,也不再需要任何机器有固定的IP地址了。现在,网上有许多著名的P2P软件,如疯狂一时的BT、现今的eMule、倍受青睐的QQ等。
P2P体系结构的优点之一就是它的可伸缩性。例如,在P2P文件共享程序中,数万的peer也许会参与到其中,每个peer既作为服务器向其他peer提供资源,又作为客户端从其他peer下载文件。因此,每增加一个peer,不仅增加了对资源的需求,也增加了对资源的供给。
另一方面,P2P用户高度分散,它们难以管理。如,有一个重要的文件仅一个peer拥有,但是这个peer随时都有可能离开网络。
实际上,单纯使用P2P体系结构的程序很少,大都需要一个中心服务器来维护总体状态,初始化客户端之间的连接等,这可以算是两种体系结构的混合了。由于网络结构不同,防火墙设置各异,编程时还会遇到更多的问题,如如何穿过内网防火墙、如何穿过NAT等,后面会详细介绍。
1.4.2 网络程序通信实体
进程是通信的实体,它们在不同的终端系统上通过计算机网络来交流信息。发送进程创建消息,将之发送到网络,接收进程接收这些消息,发送响应。
1.客户和服务器进程
对于相互通信的两个进程,通常称一方为客户,另一方为服务器。在Web里,浏览器是客户进程,Web服务器是服务器进程。在P2P文件共享系统里,下载文件的peer称为客户,上传文件的peer称为服务器。下面给出客户和服务器进程的具体定义:
在一对进程的通信会话上下文中,初始化通信的进程称为客户,等待通信连接的进程称为服务器。
2.套接字(Socket)
从一个进程发送到另一个进程的任何消息都必须经过下层网络。进程从网络中接收数据,向网络发送数据都是通过它的套接字(Socket)来进行的。为了理解进程和套接字的关系,我们打个比方,进程好比是一个房子,套接字便是房子的门。当进程向其他主机中的进程发送消息时,它将消息推出门(套接字)进入网络。一旦消息到达目标主机,它穿过接收进程的门(套接字),传递给接收进程。所以,套接字便是主机内应用层和传输层的接口,也称为程序和网络间的API(Application Programming Interface,应用程序编程接口)。本书在讲述用户模式网络程序设计时,使用的主要是Windows提供的套接字接口。
1.4.3 网络程序开发环境
为了便于直接使用Windows提供的网络编程接口,深入了解Windows系统网络组件的层次结构,本书主要使用Visual C++ 6.0作为编程工具。为了使用Windows 2000/XP操作系统的新特性,用户可以更新SDK工具。笔者在编写这本书时使用的是Microsoft Windows Server 2003 SP1 SDK,其下载地址是http://www.microsoft.com/msdownload/platformsdk/sdkupdate/。
下载SDK并安装后,还要对Visual C++开发环境进行设置。单击菜单“Tools/Options...”,弹出Options对话框,选择Directories选项卡,首先在“Show directories for:”下拉菜单中选择Include files,将新SDK中头文件的目录添加到“Directories:”列表中,并将其移动到最上方,如图1.8(左)所示,然后在“Show directories for:”下拉菜单中选择Library files,进行同样的设置,如图1.8(右)所示。
https://yqfile.alicdn.com/81ed737e80c67769f7cdf2249a0e2950e2f23653.png" >
在讲述内核网络组件开发时,还需要下载安装Windows DDK工具,后面再详细说明。
编写网络程序,调试工具是必不可少的,这里推荐使用免费工具Dbgview,它可以方便地同时显示内核模式和用户模式下的调试信息。