21网络编程Word格式.docx
- 文档编号:19082760
- 上传时间:2023-01-03
- 格式:DOCX
- 页数:40
- 大小:595.07KB
21网络编程Word格式.docx
《21网络编程Word格式.docx》由会员分享,可在线阅读,更多相关《21网络编程Word格式.docx(40页珍藏版)》请在冰豆网上搜索。
传统的万维网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.关闭连接
应
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 21 网络 编程