21网络编程.docx

上传人:b****5 文档编号:6084641 上传时间:2023-01-03 格式:DOCX 页数:40 大小:595.07KB
下载 相关 举报
21网络编程.docx_第1页
第1页 / 共40页
21网络编程.docx_第2页
第2页 / 共40页
21网络编程.docx_第3页
第3页 / 共40页
21网络编程.docx_第4页
第4页 / 共40页
21网络编程.docx_第5页
第5页 / 共40页
点击查看更多>>
下载资源
资源描述

21网络编程.docx

《21网络编程.docx》由会员分享,可在线阅读,更多相关《21网络编程.docx(40页珍藏版)》请在冰豆网上搜索。

21网络编程.docx

21网络编程

第21章网络编程

这里所说的网络主要是指因特网(Internet)。

本章先介绍网络与编程的一些基本概念,然后重点讲解套接字(Socket)和WinInet的MFC编程,最后简介ASP.NET的Web编程。

21.1网络与编程

本节先介绍网络的概念和发展简史,再给出两种主流的分层网络模型,然后讨论与网络编程有关的接口和技术等基本内容。

21.1.1网络

我们所说的网络(network)一般指计算机网络,它是一种由多台独立自主的计算机通过软硬件互连,以实现资源共享和信息交换的系统。

提供资源或信息的计算机和软件被称为服务器,请求和使用资源或信息的计算机和软件被称为客户端。

如网站是Web服务器,浏览器就是Web客户端。

依据通信的距离和范围,网络可以分成(十米~几公里的)局域网(LocalAreaNetwork,LAN,如校园网)、(几十公里内的)城域网(Metropolitan[都市/大城市]AreaNetwork,MAN,如3G网)和(百公里外的)广域网(WideAreaNetwork,WAN,如因特网)。

局域网有多种拓扑结构(参见图21-1),目前使用最广泛的是采用总线型拓扑结构的以太网(Ethernet),它是由美国施乐(Xerox)公司帕洛阿尔托研究中心(PARC)的BobMetcalfe于1976年发明的(1979年他离开了施乐创建了3COM公司),以太网使用CSMA/CD(载波监听多路访问及冲突检测技术)技术,并以10~1000M/S的速率运行在多种类型的电缆上。

以太网与IEEE802.3系列标准相似。

网络的核心是协议(Protocol)。

21.1.2因特网

因特网(Internet,网际网/互联网)的前身是1969年底启用的ARPANet(AdvancedResearchProjectsAgencyNetwork,[美国国防部]高级研究计划署网络,阿帕网),由BobTaylor和LarryRoberts等人主持研制。

1973年底,RobertE.Kahn和VintonCerf提出了基于包交换的两个网络协议IP(InternetProtocol,网际协议)和TCP(TransmissionControlProtocol,传输控制协议),1983年元旦ARPANet启用TCP/IP协议集。

1986年,ARPANet的主干网被NSFNet(NationalScienceFoundationNetwork,[美国]国家科学基金会网络)接替,并改名为Internet(因特网),1991年起对社会开放。

21.1.3万维网

图21-1TimBerners-Lee

1990年10月在CERN(ConseilEuropeenpourlaRechercheNucleaire,欧洲粒子物理研究所)工作的TimBerners-Lee(参见图21-1)提出了因特网应用层的两个协议:

用于描述网页的HTML(HyperTextMarkupLanguage,超文本标记语言)和用于传输网页文档和各种资源数据的HTTP(HypertextTransferProtocol,超文本传输协议),创立了万维网(WorldWideWeb,WWW,环球网),一般简称为Web(蜘蛛网),Web很快成为因特网的主体。

1993年初,美国Illinois(伊利诺)大学的硕士研究生MarcAnderressen与EricBina合作在位于该校内的NCSA(NationalCenterforSupercomputingApplications美国超级计算应用中心)开发出支持内嵌图像的网页浏览器马赛克(Mosaic),1994年10月Anderressen等人创办的网景公司Netscape推出了Navigator浏览器,得到广泛使用,大大推动了互联网的普及。

1995年微软公司从伊利诺大学购得马赛克技术,并在此基础上开发出IE(InternetExplorer,因特网探索者)浏览器,随Windows95免费推出。

被微软公司挤垮的网景公司于1998年11月被AOL公司收购,并于2003年7月成立了非盈利的Mozilla基金会,在其资助下于2004年11月9日推出了基于Mosaic的Firefox(火狐)浏览器。

1994年10月Berners-Lee创立了万维网联盟(WorldWideWebConsortium,W3C),负责万维网的管理和技术标准的制定。

1998年2月W3C推出了划时代的XML(eXtensibleMarkupLanguage,可扩展标记语言),2000年1月又推出了用来替代HTML的XHTML(ExtensibleHTML,可扩展HTML)。

传统的万维网Web正在向新的万维网OneWeb过渡,参见图21-2。

图21-2Web体系结构的发展

其中:

●URL(UniformResourceLocator,统一资源定位符)——在因特网的Web服务程序上用于指定信息位置的表示方法,如

●URI(UniformResourceIdentifier,统一资源标识符)——=URL+URN。

●URN(UniformResourceName,统一资源命名)——使用urn方案的URI,不一定意味着有确定的资源可用。

如urn:

isbn:

0451450523。

●IRI(InternationalizedResourceIdentifiers,国际化资源标识符)——URI的国际化,支持Unicode。

21.1.3IP网络的分层与协议

这里的IP网络是指基于因特网协议套件(TCP/IP协议栈)的网络,包括:

因特网(Internet)、城域网(MetropolitanAreaNetwork,MAN)和内部网(Intranet)等。

为了便于分析和管理,一般将通信网络抽象为若干层。

主要有ISO(和IEC共同)制定的7层参考模型(ReferenceModel)ISO/OSI(国际标准,失败,主要用于理论研究)和因特网5层参考模型TCP/IP协议栈(实事标准,成功,应用十分广泛)。

参见表21-1和图21-2&3。

表21-1ISO/OSI7层参考模型

OSI模型

数据单元

功能

主机层

数据

7.应用

对应用的网络过程

6.表示

数据表示与加密

5.会话

主机间通信

4.传输

端到端连接与可靠性(TCP)

介质层

包/数据报

3.网络

路径确定与逻辑寻址(IP)

2.数据链接

物理寻址(MAC&LLC)

1.物理

介质,信号与二进制传送

其中:

●ISO(InternationalOrganizationforStandardization,国际标准化组织)——由153个国家的国家标准学会联合组成的一个非政府国际组织,总部(中央秘书处)设在瑞士的日内瓦,负责制定适应商业和广泛社会需要的各种国际标准,网址为http:

//www.iso.org。

●IEC(InternationalElectrotechnicalCommission,国际电工技术委员会)——一个成立于1906年6月的国际标准化权威组织,属于联合国的甲级咨询机构,负责制定关于电工电子各方面的标准,有42个会员国,总部也设在瑞士的日内瓦,网址为http:

//www.iec.ch。

●OSI(OpenSystemsInterconnection,开放系统互连)——一种通信协议的7层抽象的参考模型,其中每一层执行某一特定任务。

该模型的目的是使各种硬件在相同的层次上相互通信。

对应的国际标准为:

ISO7498:

1984、ISO/IEC7498-1~4:

1994、1989、1989、1997)。

●MAC(MediaAccessControl,介质访问控制)——数据链路层的子层,提供寻址和信道访问的控制机制,位于物理层和逻辑链路层之间。

●LLC(LogicalLinkControl,逻辑链路控制)——数据链路层的上部子层,在MAC层上传输的多路复用和分离协议,提供流量和差错控制。

ISO/OSI7层参考模型因特网5层参考模型(及协议)

应用层(Application)应用层(HTTP/HTML、FTP、SMTP/POP3/IMAP、……)

表示层(Presentation)

会话层(Session)

传输层(Transport)传输层(TCP/UDP)

网络层(Network)互连网层(IP/ICMP/IGMP)

数据链路层(Data-link)网络接口层(ARP/RARP)

物理层(Physical)物理层

图21-2OSI与因特网参考模型的层次对应关系

其中:

●ARP(AddressResolutionProtocol,地址解析协议)——计算机用来匹配IP地址到硬件地址的协议。

计算机调用ARP广播一个请求,目标计算机应答该请求。

●RARP(ReverseAddressResolutionProtocol,逆向地址解析协议)——计算机系统在自举时获取IP地址的协议。

●IP(InternetProtocol,网际协议)——定义互联网上包的格式与路由包到其目的地之机制。

●ICMP(InternetControlMessageProtocol,互连网控制消息协议)——提供网络层的控制手段和差错报告。

●IGMP(InternetGroupManagementProtocol,互连网组管理协议)——用来管理组播的,它是参加组播的主机与路由器之间交换组员信息的协议。

不过,组播目前存在多个组的地址冲突问题,而且,现有的路由器一般不支持组播。

●TCP(TransmissionControlProtocol,传输控制协议)——为应用程序提供访问面向连接的通信服务,可靠、控制流量。

特点:

面向连接、累计确认与超时重传(保证数据传输的可靠性)、拥塞控制(基于滑动窗口协议)、报头变长(≥24B)。

●UDP(UserDatagramProtocol,用户数据报协议)——为用户提供无连接的服务,高效但不可靠,主要用于传输多媒体数据。

特点:

无连接、无差错控制(不重传)、报头中的校验和可选(可不计算和存储)、报头定长(8B)。

●FTP(FileTransferProtocol,文件传输协议)——因特网上管理文件传输的通讯协议,用于从一台计算机到另一台计算机传送完整的文件。

●SMTP(SimpleMessageTransferProtocol,简单邮件传输协议)——用于电子邮件的传输。

●POP3((PostOfficeProtocol,邮局协议第三版)——提供用户计算机对(本地邮件服务器中的)电子邮箱进行远程存取的脱机协议。

●IMAP(InternetMessageAccessProtocol,因特网消息访问协议)——提供用户计算机对(本地邮件服务器中的)电子邮箱进行远程操作的联机协议。

图21-3IP网络模型

21.1.4因特网编程

通用的因特网编程,一般采用传统的套接字(Sockets)网络API,在Windows平台中对应的是Winsock。

微软还自己开发了用于因特网应用层的编程接口WinInet。

.NET3.0新推出的WCF(WindowsCommunicationFoundation,视窗通信基础)提供了统一且可扩展的构建分布式系统的API。

而ASP.NET则是微软主推的构建Web应用的开发平台工具,与Oracle/Sun的JSP形成直接竞争关系。

1.Sockets和Winsock

因特网(Internet)最初是基于Unix的,而Sockets(套接字/插座)是Unix第一个支持TCP/IP协议栈的网络API,最早于1982年8月随4.2BSD版Unix推出,常被称为Berkeleysockets(伯克利套接字)。

Unix的BSD(BerkeleySoftwareDistribution,[美国加州大学]伯克利分校软件分发)版,是由Sun公司的创始人之一兼首席技术官BillJoy(比尔·乔伊)于1977年在伯克利分校读研期间自己开发的。

Sockets也是由他编写的。

图21-4BillJoy

Winsock(WindowsSocketsAPI)是从Sockets移植过来的TCP/IP编程的低级WindowsAPI,由JSB公司的MartinHall、Sun公司的MarkTowfiq和GeoffArnold、微软公司的HenrySanders和JAllard等人共同开发。

Winsock的版本有:

●1.0(1992年6月,微软不支持)

●1.1(1993年1月,微软在WindowsforWorkgroups3.1的扩展包中支持,该扩展包也是Windows95和WindowsNT3.x的组成部分)

●2.0(1994年,未公开发布)

●2.1.0(1996年1月,首个公开发布的Winsock2规范,微软在Windows95的扩展包中支持,该扩展包也是Windows98和WindowsNT4.0及后续Windows版本的组成部分)

●2.2.0(1996年5月,去掉了对16位Windows应用程序的支持)

●2.2.1(1997年5月)

●2.2.2(1997年8月)

在Windows中,除了可以直接用WinsockAPI进行C/C++编程外,还可以用Winsock的MFC和.NETBCL封装进行面向对象和组件的编程。

MFC封装的Winsock类有:

基本的异步套接字类CAsyncSocket和简单的套接字类CSocket。

为了使用Winsock编程,程序员得详细了解因特网应用层的具体协议内容。

2.WinInet

使用Winsock编程,程序员必须与基本的网络通信打交道,还必须详细了解因特网应用层协议的具体内容,包括对话模式、命令的组成和格式、命令发送的顺序等等。

为了方便因特网应用程序的编写,微软在Winsock之外,还自己开发了用于因特网应用层编程的接口WinInet(Win32InternetExtensions,32位Windows的因特网扩展)。

WinInet的优点:

●支持高速缓存——似IE,将HTML和其他因特网文件放入本地磁盘的特定目录,下次可直接加载该文件,而不是重复从因特网下载

●安全——支持基本的质询/响应鉴别和SSL(SecureSocketLayer安全套接字层)

●采用缓冲I/O——read函数不返回值,可读取单独的文本行

●简单——可使用状态回调函数OnStatusCallBack来对UI更新和注销;调用一个函数CInternetSession:

:

OpenURL就可以找到IP地址、建立连接并准备好文件读取

●友好——可分析和格式化报头,访问已经被移动的新位置处的服务器和文件

MFC也包括了对WinInet的封装,提供了一些十分好用的类与全局函数,包括对HTTP、FTP、Gopher等协议的处理。

3.WCF

4.Web开发

ASP.NET

21.2MFC套接字编程

MFC提供了两个套接字类CAsyncSocket和CSocket,它们封装了Winsock1.0版的函数,可方便地编写因特网程序。

CAsyncSocket提供异步读写(网络通信),而CSocket则提供同步读写(网络通信),后者是前者的派生类,它们都是MFC的基类CObject的派生类,参见图21-5。

图21-5MFC套接字`类

基类CAsyncSocket提供全面的由事件驱动的Socket通信能力,你可以在派生的套接字类中响应这些事件。

CSocket类是CAsyncSocket的派生类,封装和简化了其基类的某些功能,是Winsock的高层接口。

由于Windows程序是基于消息机制的,MFC的套接字类也提供消息编程,可以通过它们的成员函数AsyncSelect来选择感兴趣的事件。

21.2.1编程过程

为了使建立的项目支持Winsock,需要在"MFC应用程序向导"的"高级功能"页中选中"Windows套接字"复选框。

1.初始化Winsock环境

在使用MFC的套接字类之前,必须为应用程序初始化Winsock环境,这只需在项目的应用类的初始化实例函数InitInstance中调用全局函数AfxSocketInit:

BOOLAfxSocketInit(WSADATA*lpwsaData=NULL);

该函数以WSADATA结构:

structWSAData{

WORDwVersion;//套接字规范的(最低)板本

//低/高字节为主/次版本号,如257:

1.1

WORDwHighVersion;//套接字规范的最高版本,如514:

2.2

charszDescription[WSADESCRIPTION_LEN+1];//描述串

//如“WinSocket2.0”

charszSystemStatus[WSASYSSTATUS_LEN+1];//系统状态串

//如“Running”

unsignedshortiMaxSockets;//单个进程可打开的最大套接字数,如32767

unsignedshortiMaxUdpDg;//可收发的UDP报文的最大字节数,如65467

charFAR*lpVendorInfo;//指向厂商指定数据结构的指针,WinSock不支持

};//其中的iMaxSockets和iMaxUdpDg用于兼容1.1版,在2.0版中不用

作为可选参数,能得到当前计算机的Winsock的版本等信息。

一般不需要,如:

BOOLCSockApp:

:

InitInstance(){

……

if(!

AfxSocketInit())

{

AfxMessageBox(IDP_SOCKETS_INIT_FAILED);

returnFALSE;

}

……

}

若在项目创建过程中,选中了“Windows套接字”复选框,则MFC会在程序中自动添加上述代码。

2.创建套接字

为了使所建立的应用程序可以使用套接字,还必须在项目的应用类中声明一个MFC套接字[派生]类的类变量,如:

classCSockApp:

publicCWinApp{

……

private:

CAsyncSocketm_sSock;

}

在使用该对象之前,必须调用其Create成员函数来构造具体的套接字:

BOOLCreate(UINTnSocketPort=0,intnSocketType=SOCK_STREAM,

longlEvent=FD_READ|FD_WRITE|FD_OOB|FD_ACCEPT|

FD_CONNECT|FD_CLOSE,LPCTSTRlpszSocketAddress=NULL);

客户端一般不需要任何输入参数,但对服务器端的网络应用程序,需要指定监听端口号(nSocketPort),如:

●客户端:

m_sSock.Create();

●服务器端:

m_sServSock.Create(4000);

其中,参数nSocketType可取值为SOCK_STREAM(对应于传输层面向连接的TCP协议)和SOCK_DGRAM(对应于传输层无连接的UDP协议);参数lpszSocketAddress为网络地址,当计算机上有多个网卡时有用,单网卡可用127.0.0.1(本机的IP地址)。

TCP和UDP的端口是一个16位无符号整数,取值范围为0~65535。

其中,0~1023为著名端口、1024~49151为已注册端口、49152~65535为动态或私有端口。

下面是若干常用的缺省TCP/UDP端口:

HTTP(80)、HTTPS(443)、FTP(21)、SMTP(25)、POP3(110)、DNS(53)、SQL(118/156)、Login(513)、Echo(7)、Socketproxy(1080)、Webproxy(8080)。

3.打开连接

打开一个网络连接需要三个步骤:

●服务器端调用Listen函数监听连接请求:

BOOLListen(intnConnectionBacklog=5);//待连接的队列长度,最大为5

●客户端调用Connect函数发出连接请求:

BOOLConnect(LPCTSTRlpszHostAddress,UINTnHostPort);

●服务器端调用Accept函数接受连接请求:

virtualBOOLAccept(CAsyncSocket&rConnectedSocket,

SOCKADDR*lpSockAddr=NULL,

int*lpSockAddrLen=NULL);

如:

if(m_sServSock.Listen())...else...

if(m_sSock.Connect(L"127.0.0.1",4000))...else...

if(m_sServSock.Accept(m_sSock))...else...

若连接成功或失败,CAsyncSocket都会激发一个事件通知应用程序,而CSocket类在连接成功或失败之前不会返回。

4.发送/接收消息

可以通过套接字发送和接收任何类型的数据,需要一个缓冲区来存放待发或刚接收到的数据。

发送数据使用Send函数:

virtualintSend(constvoid*lpBuf,intnBufLen,intnFlags=0);//返回发送的数据总量

接收数据则使用Receive函数:

(在接收完数据之前不会返回)

virtualintReceive(void*lpBuf,intnBufLen,intnFlags=0);//返回接收到数据量

出错都返回SOCKET_ERROR。

如:

●发送:

CStringstrMessage;

intiLen,iError;

...

iLen=strMessage.GetLength();

iError=m_sSock.Send(LPCSTR(strMessage),iLen);

if(iError==SOCKET_ERROR)...else...

●接收:

char*pBuf=newchar[1025];

intiBufSize=1024;

intiRcvd;

CStringstrRecvd;

iRcvd=m_sSock.Receive(pBuf,iBufSize);

if(iRcvd==SOCKET_ERROR)...

else{

pBuf[iRcvd]=NULL;//分隔垃圾数据

strRecvd=pBuf;

...

}

5.关闭连接

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 求职职场 > 简历

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1