《信息通信网络概论》实验指导书Word格式.docx
- 文档编号:8244514
- 上传时间:2023-05-10
- 格式:DOCX
- 页数:31
- 大小:94.37KB
《信息通信网络概论》实验指导书Word格式.docx
《《信息通信网络概论》实验指导书Word格式.docx》由会员分享,可在线阅读,更多相关《《信息通信网络概论》实验指导书Word格式.docx(31页珍藏版)》请在冰点文库上搜索。
3.1利用MFCAppWizard生成程序框架16
3.2增加控件对象16
3.3从CAsyncSocket类继承16
3.4建立客户机与服务器之间的连接16
3.5发送和接收数据17
3.6终止连接17
4、结束语17
六、思考题或讨论题18
实验四﹑计算机网络通信应用程序设计19
(一)基于TCP/IP的计算机网络通信应用程序设计19
一、实验目的19
二、实验内容19
三、实验步骤19
(二)基于UDP/IP的计算机网络通信应用程序设计20
一、实验目的20
二、实验内容20
三、实验步骤21
四、思考题或讨论题21
附录:
实验中需要用到的WINSOCKAPI函数和数据结构22
accept():
22
bind()23
closesocket():
24
connect():
26
listen():
27
socket():
28
recv():
29
send():
31
WSAAsyncSelect():
32
WSAStartup():
36
Gethostbyname37
Gethostbyaddr38
inet_ntoa38
inet_addr38
WSADATA和LPWSADATA38
实验一TCP/IP协议与Socket编程认识实验
一、实验目的
1)熟悉TCP/IP协议的功能和网络操作;
2)了解基于SOCKET的编程原理;
3)编写一个小型的Socket实用程序,初步了解Windows环境下使用Socket的编程。
二、实验内容
在已有的程序框架下,编写一个查询主机地址和域名的程序。
实现功能:
1)输入域名查询IP地址;
2)输入IP地址查询域名。
三、实验原理
1)什么是WindowsSockets规范?
WindowsSockets规范以U.C.Berkeley大学BSDUNIX中流行的Socket接口为范例定义了一套MicosoftWindows下网络编程接口。
它不仅包含了人们所熟悉的BerkeleySocket风格的库函数;
也包含了一组针对Windows的扩展库函数,以使程序员能充分地利用Windows消息驱动机制进行编程。
WindowsSockets规范本意在于提供给应用程序开发者一套简单的API,并让各家网络软件供应商共同遵守。
此外,在一个特定版本Windows的基础上,WindowsSockets也定义了一个二进制接口(ABI),以此来保证应用WindowsSocketsAPI的应用程序能够在任何网络软件供应商的符合WindowsSockets协议的实现上工作。
因此这份规范定义了应用程序开发者能够使用,并且网络软件供应商能够实现的一套库函数调用和相关语义。
遵守这套WindowsSockets规范的网络软件,我们称之为WindowsSockets兼容的,而WindowsSockets兼容实现的提供者,我们称之为WindowsSockets提供者。
一个网络软件供应商必须百分之百地实现WindowsSockets规范才能做到现WindowsSockets兼容。
任何能够与WindowsSockets兼容实现协同工作的应用程序就被认为是具有WindowsSockets接口。
我们称这种应用程序为WindowsSockets应用程序。
WindowsSockets规范定义并记录了如何使用API与Internet协议族(IPS,通常我们指的是TCP/IP)连接,尤其要指出的是所有的WindowsSockets实现都支持流套接口和数据报套接口.应用程序调用WindowsSockets的API实现相互之间的通讯。
WindowsSockets又利用下层的网络通讯协议功能和操作系统调用实现实际的通讯工作。
它们之间的关系如图1-1。
2)Winsock编程模型
1)建立socket。
程序使用socket进行网络时,必须先建立一个socket。
为了建立一个socket,成需要调用socket函数。
例子:
socket_handle=socket(protocol_family,_socket_type,protocol);
2)配置一个socket。
为了配置一个,程序可使用WinsockAPI中不同的函数。
一般来讲,每个socket需要五种信息:
本地和远地机的IP地址,本地和远地进程的协议端口,联接上使用的协议。
3)连接一个socket。
面向连接客户程序必须提供给Socket的唯一地址信息是远地主机信息—IP地址和协议端口。
4)使用一个Socket,程序能够使用WinsockAPI在一个配置好的Socket上传送和接收数据。
I/O函数如下:
Send,通过连接的Socket传送数据,使用特殊的标志控制Socket的行为。
Sendto,将数据传送给Socket地址结构指定的主机,传送时使用一个简单的报文缓冲区。
Recvfrom,从Socket接收数据,选择发送主机的网络地址,传送时使用一个简单的报文缓冲区。
5)使用一个连接的Socket。
由于Send函数不能指定目的地址,因此,程序只能在连接的Socket上使用它。
也就是说,在程序使用Send函数之前,必须建立一个Socket。
6)使用一个无连接的Socket。
当没有建立Socket连接时,上述的Send函数便不能使用,这是需要用Sendto函数。
四、实验步骤
1)网络程序初始化,服务器和客户端WinSockAPI均要求在调用其他WinSock函数以前先调用WSAStartUp函数初始化。
2)创建套接字Socket()。
3)配置并启动套接字。
4)通过Socket发送和接收数据。
5)程序结束时必须关闭Socket,使用与WSAStartUp()相对应的函数WSACleanUp(),释放所分配的内部缓冲区和其他资源。
五、思考题或讨论题
1.WinInet有什么作用?
2.结合本次实验,谈谈使用MFCWinInet类有哪些优点?
实验二FTP客户端通信程序设计
1.了解Windows下的TCP/IP通信方式与网络操作
2.熟悉FTP的编程的过程;
3.学会用可视化编程语言编写调试简单的通信程序。
二、实验内容
在已有的程序框架下,编写一个FTP客户端程序。
1)连接到FTP主机,下载FTP文件服务器文件列表;
2)切换访问目录;
3)向FTP服务器发送文件(上传文件);
4)从FTP服务器下载文件(下载文件)。
在使用MFC编程时,要连接到FTP服务器是一件非常简单的事情,只需要两个简单的步骤,首先必须建立一个CinternetSession对象,用类CinternetSession创建并初始化一个或几个同时存在的Internet会话(Session),并描述与代理服务器的连接(如果有必要的话),如果在程序运行期间需要保持与Internet的廉洁,可以创建一个CinternetSession对象作为类CwinApp的成员。
MFC中的类CftpConnection管理我们与Internet服务器的连接,并直接操作服务器上的目录和文件,FTP时MFC的WinInet支持的三个Internet功能之一,我们需要先创建一个CinternetSession实例和一个CftpConnection对象就可以实现和一个FTP服务器通信,我们不需要直接创建CftpConnection对象,而是通过调用CinternetSession:
:
GetFtpConnection来完成这项工作。
他创建CFtpConnection对象并返回一个指向该对象的指针。
在FTP连接的程序中,主要适用下列7个函数:
1)CInternetSession对象
语法:
CInternetSession(LPCTSTRpstrAgent,DWORDdwConText,DWORDdwAccessType,LPCTSTRpstrProxyName,LPCTSTRpstrProxyBypass,DWORDdwFlags);
注释:
在创建CInternetSession对象时调用这个成员函数,CInternetSession是应用程序第一个要调用的Internet函数,它将创始化内部数据结构,以备将来在应用程序中调用。
如果dwFlags包含INTERNET_FLAG_ASYNC,那末从这个句柄派生的所有的句柄,在状态回调例程注冊之前,都会出现异步状态。
如果沒有打开Internet连接,CInternetSession就会抛出一个例外,fxThorowInternetException。
2)GetFtpConnection()函数。
CFtpConnection*CIternetSession:
GetFtpConnection(LPCTSTRpstrServer,LPCTSTRpstrUserName,LPCTSTRpstrPassword,INTERNET_PORTnPort,BOOLbPassive);
调用这个函数建立一个FTP连接,并获得一个指向CFtpConnection对象的指针,GetFtpConnection连接到一个FTP服务器,创建并返回指向CFtpConnection对象的指针,它不在服务器上进行任何操作。
如果打算读写文件,必须进行分步操作。
关于查找,打开和读/写文件的信息需参考CFtpConnection和CFtpFileFind类。
对这个函数的调用返回一个指向CFtpConnection对象的指针。
如果调用失败,检查抛出的CInternetException对象,就可以确定失败的原因。
3)GetFile()函数。
BOOLGetFile(LPCTSTRpstrRemoteFile,LPCTSTRpstrLocalFile,BOOLbFailExists,DWORDdwAttributes,DWORDdwFlags,DWORDdwContext);
调用这个成员函数,可以从FTP服务器取得文件,并且把文件保存在本地机器上。
GetFile()函数是一个比较高级的例程,它可以处理所有有关从FTP服务器读文件,以及把文件存放在本地机器上的工作。
如果dwFlags为FILE_TRANSFER_TYPE_ASCII,文件数据的传输也会把控制和格式符转化为Windows中的等阶符号。
默认的传输模式是二进制模式,文件会以和服务器上相同的格式被下载。
pstrRemoteFile和pstrLocalFile可以是相对于当前目录的部分文件名,也可以是全文件名,在这两个名字中间,都既可以用反斜杠(\)或者正斜杠(/)来作为文件名的目录分隔符,GetFile()在使用前会把目录分隔符转化为适当的字符。
可以用自己选择的值来取代dwContext默认的值,设置为上下文标识符与CFtpConnection对象的定位操作有关,这个操作由CFtpConnection中的CInternetSession对象创建。
返回给CInternetSession:
OnStatusCallBack的值指出了所标识操作的状态。
如果调用成功,函数的返回为非0,否则返回0,如果调用失败,可以调用Win32函数GetLastError(),确认出错的原因。
4)PutFile()函数。
BOOLPutFile(LPCTSTRpstrLocalFile,LPCTSTRpstrRemoveFile,DWORDdwFlags,DWORDdwContext);
调用这个成员函数可以把文件保存到FTP服务器。
PutFile()函数是一个比较高级的例程,它可以处理有关把文件存放到服务器上的工作。
只发送数据,或要严格控制文件传输的应用程序,应该调用OpenFile和CInternet:
Write。
利用自己选择的值来取代dwContext默认的值,设置为上下文标识符,上下文标识符是CInternetSession对象创建的CFtpConnection对象的特定操作有关,这个值返回给CInternetSession:
OnStateCallBack,从而把操作的状态通报给它所标识的上下文。
5)FTP文件查找函数。
调用这个成员函数构造一个CftpFileFind对象。
6)FindFile()函数。
调用这个函数查找FTP文件,调用它检索到第一个FTP文件后,可以调用FindNextFile()检索后面的FTP文件。
7)FindNextFile()函数。
调用这个函数继续查找文件,在调用任何属性以前,必须已经至少调用过一次此函数。
以上函数的具体使用方法可以参见MSDN。
四、思考题或讨论题
实验三基于客户/服务器模式的网络通信编程实现
(基于Socket的网络聊天室的设计与实现)
一、实验目的
1.进一步了解网络编程的过程;
2.掌握Windows环境下基于WinSock的编程方法和通信实现;
3.熟悉客户/服务器模式的网络通信编程实现,编写一个聊天工具,即以客户端和服务器端的模式进行互发消息。
Internet上可以提供一种叫IRC的服务。
使用者通过客户端的程序登录到IRC服务器上,就可以与登录在同一IRC服务器上的客户进行交谈,这也就是平常所说的聊天室。
在已有的程序框架下,编写一个类似的聊天程序。
1)服务器端:
i.建立Socket,绑定端口,并监听;
ii.接受客户端的连接;
iii.与客户端进行通讯;
iv.断开连接。
2)客户端:
i.建立Socket,并申请连接到服务器;
ii.与服务器进行通讯;
iii.断开连接。
三、实验原理
一个在建立分布式应用时最常用的范例便是客户机/服务器模型。
在这种方案中客户应用程序向服务器程序请求服务。
这种方式隐含了在建立客户机/服务器间通讯时的非对称性。
客户机/服务器模型工作时要求有一套为客户机和服务器所共识的惯例来保证服务能够被提供(或被接受)。
这一套惯例包含了一套协议。
它必须在通讯的两头都被实现。
根据不同的实际情况,协议可能是对称的或是非对称的。
在对称的协议中,每一方都有可能扮演主从角色;
在非对称协议中,一方被不可改变地认为是主机,而另一方则是从机。
一个对称协议的例子是Internet中用于终端仿真的TELNET。
而非对称协议的例子是Internet中的FTP。
无论具体的协议是对称的或是非对称的,当服务被提供时必然存在“客户进程”和“服务进程”。
一个服务程序通常在一个众所周知的地址监听对服务的请求,也就是说,服务进程一直处于休眠状态,直到一个客户对这个服务的地址提出了连接请求。
在这个时刻,服务程序被“惊醒”并且为客户提供服务-对客户的请求作出适当的反应。
这一请求/相应的过程可以简单的用图2-1表示。
虽然基于连接的服务是设计客户机/服务器应用程序时的标准,但有些服务也是可以通过数据报套接口提供的。
四、应用程序的设计方法和步骤
1)服务端
1)建立Socket初始化WinSock的动态连接库后,需要在服务器端建立一个监听的Socket,为此可以调用Socket()函数用来建立这个监听的Socket,并定义此Socket所使用的通信协议。
此函数调用成功返回Socket对象,失败则返回INVALID_SOCKET(调用WSAGetLastError()可得知原因,所有WinSocket的函数都可以使用这个函数来获取失败的原因)。
2)绑定端口接下来要为服务器端定义的这个监听的Socket指定一个地址及端口(Port),这样客户端才知道待会要连接哪一个地址的哪个端口,为此我们要调用bind()函数,该函数调用成功返回0,否则返回SOCKET_ERROR。
3)监听当服务器端的Socket对象绑定完成之后,服务器端必须建立一个监听的队列来接收客户端的连接请求。
listen()函数使服务器端的Socket进入监听状态,并设定可以建立的最大连接数(目前最大值限制为5,最小值为1)。
该函数调用成功返回0,否则返回SOCKET_ERROR。
服务器端的Socket调用完listen()后,如果此时客户端调用connect()函数提出连接申请的话,Server端必须再调用accept()函数,这样服务器端和客户端才算正式完成通信程序的连接动作。
为了知道什么时候客户端提出连接要求,从而服务器端的Socket在恰当的时候调用accept()函数完成连接的建立,我们就要使用WSAAsyncSelect()函数,让系统主动来通知我们有客户端提出连接请求了。
4)服务器端接受客户端的连接请求当Client提出连接请求时,Server端hwnd视窗会收到WinsockStack送来我们自定义的一个消息,这时,我们可以分析lParam,然后调用相关的函数来处理此事件。
为了使服务器端接受客户端的连接请求,就要使用accept()函数,该函数新建一Socket与客户端的Socket相通,原先监听之Socket继续进入监听状态,等待他人的连接要求。
该函数调用成功返回一个新产生的Socket对象,否则返回INVALID_SOCKET。
5)结束socket连接结束服务器和客户端的通信连接是很简单的,这一过程可以由服务器或客户机的任一端启动,只要调用closesocket()就可以了,而要关闭Server端监听状态的socket,同样也是利用此函数。
2)客户端客户端比较简单,只有一个socket,与服务端进行连接。
连接建立好后,通过此SOCKET发送和接收信息。
1)建立客户端的Socket客户端应用程序首先也是调用WSAStartup()函数来与Winsock的动态连接库建立关系,然后同样调用socket()来建立一个TCP或UDPsocket(相同协定的sockets才能相通,TCP对TCP,UDP对UDP)。
与服务器端的socket不同的是,客户端的socket可以调用bind()函数,由自己来指定IP地址及port号码;
但是也可以不调用bind(),而由Winsock来自动设定IP地址及port号码。
2)提出连接申请客户端的Socket使用connect()函数来提出与服务器端的Socket建立连接的申请,函数调用成功返回0,否则返回SOCKET_ERROR。
3)数据的传送虽然基于TCP/IP连接协议(流套接字)的服务是设计客户机/服务器应用程序时的主流标准,但有些服务也是可以通过无连接协议(数据报套接字)提供的。
介绍一下TCPsocket与UDPsocket在传送数据时的特性:
Stream(TCP)Socket提供双向、可靠、有次序、不重复的资料传送。
Datagram(UDP)Socket虽然提供双向的通信,但没有可靠、有次序、不重复的保证,所以UDP传送数据可能会收到无次序、重复的资料,甚至资料在传输过程中出现遗漏。
由于UDPSocket在传送资料时,并不保证资料能完整地送达对方,所以绝大多数应用程序都是采用TCP处理Socket,以保证资料的正确性。
一般情况下TCPSocket的数据发送和接收是调用send()及recv()这两个函数来达成,而UDPSocket则是用sendto()及recvfrom()这两个函数,这两个函数调用成功发挥发送或接收的资料的长度,否则返回SOCKET_ERROR。
五、聊天室应用程序设计的具体说明
1、聊天室的工作流程
首先,服务器要创建一个用于侦听的套接字,为该套接字分配地址之后,调用listen()函数使它处于侦听状态;
客户机在创建套接字完毕后,为套接字分配地址,然后调用connect()函数,请求与服务器套接字连接;
服务器套接字在收到客户机的连接请示后,调用accept()函数,该函数创建一个用于连接的套接字。
应用该套接字和客户机上的连接套接字,用户就可以在服务器和客户机之间进行数据传输了。
在结束传输之后,客户机调用closesocket()函数关闭套接字,服务器也调用该函数关闭用于侦听和连接的套接字。
2、套接字事件处理
消息处理函数,这些函数并不对套接字作实质上的操作,是Windows为套接字加上消息驱动的产物。
它们和特定的套接字消息相关联,当消息到来时,应用程序框架就调用这些函数。
它们都是CAsyncSocket类的虚函数,因为MFC库中没有定义这些函数的内容,程序员必须根据需要重载这些函数,把对套接字进行实质操作的函数加进这些函数中。
OnAccept():
监听套接字在断口听到连接请求时,应用程序框架调用该函数以告之可以接受或拒绝连接请求,调用Accept来接受请求,建立连接。
OnConnect():
当客户端套接字连接请求完成后,应用程序框架调用该函数,告之是否成功。
OnSend():
框架调用该函数通知该套接字现在可以调用Send函数开始传送数据。
OnReceive():
框架调用该函数通知套接字可以调用Receive函数从数据缓冲区中取数据。
OnClose():
框架调用该函数告之与其相连的对方套接字已被关闭。
3、系统实现
3.1利用MFCAppWizard生成程序框架
在VisualC++的IDE环境下选择菜单File—New—Projects—MFCAppWizard(exe)—ProjectName—“OK”—“NEXT”—WindowsSockets—“Finish”按钮,选择“OK”按钮,应用程序的框架就将自动创建。
3.2增加控件对象
在创建了应用程序框架之后,可以布置程序的主对话框,向应用程序的主对话框添加控件。
设计好了对话框之后,选取View菜单中的ClassWizard菜单项,或直接按“Ctrl+W”,打开MFCClassWizard,将对话框中的控件和变量相关联,其关系如下表所示。
变量说明表
对象
名称
类别
IDC_BTN_CONNECT
m_btnConnec
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 信息通信网络概论 信息 通信 网络 概论 实验 指导书