08011302计网第三次实验.docx
- 文档编号:6532062
- 上传时间:2023-01-07
- 格式:DOCX
- 页数:12
- 大小:127.96KB
08011302计网第三次实验.docx
《08011302计网第三次实验.docx》由会员分享,可在线阅读,更多相关《08011302计网第三次实验.docx(12页珍藏版)》请在冰豆网上搜索。
08011302计网第三次实验
东南大学自动化学院
实验报告
课程名称:
信息通信网络概论
第3次实验
实验名称:
实验三消息传递应用程序
院(系):
自动化专业:
自动化
姓名:
刘燊燊学号:
08011302
实验室:
金智楼四楼一号机房实验组别:
同组人员:
实验时间:
2013年12月16日
评定成绩:
审阅教师:
目录
一.实验目的和要求………………………………………………3
二.实验原理………………………………………………………3-6
三.实验方案与实验步骤…………………………………………6
四.实验设备与器材配置…………………………………………7
五.实验记录………………………………………………………7-10
六.实验总结………………………………………………………10
七.思考题或讨论题………………………………………………11
一.实验目的和要求
目的:
1.在前面两个实验的基础上进一步了解网络编程的过程。
2.掌握Windows环境下基于WinSock的编程方法和通讯实现。
3.编写一个聊天程序,即以客户端和服务器的模式进行互发消息。
要求:
1.理解客户端和服务器模式。
2.理解CMySocket类中的套接字事件处理函数。
3.要求明白CTalkDlg类中的OnSelchangeComboType()OnBtnClose()OnBtnConnect()OnSendMsg()函数的执行过程。
二.实验原理
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_btnConnect
Control
CButton
IDC_COMBO_TYPE
m_cmbType
Control
CComboBox
IDC_EDIT_MSG
m_strMsg
Value
CString
IDC_EDIT_SERVNAME
m_strServName
Value
CString
IDC_EDIT_SERVPORT
m_nSerPort
Value
Int
IDC_LIST_RECEIVED
m_listReceived
Control
CListBox
IDC_LIST_SENT
m_listSent
Control
CListBox
3.3从CAsyncSocket类继承
选择Insert菜单中的NewClass——选取Classtype为GenericClass——在Baseclass的DerivedFrom列中输入CAsyncSocket,——在As列中接受默认值public,点击”OK”按钮,就可以把这个新创建的类添加到应用程序中。
向该套接字类中添加一个成员变量,用作指向父对话框窗口的指针,指针变量的类型为CTalkDlg*(Cdialog的派生类),变量名为m_pDlg,访问权限为私有。
最后,添加套接字类事件处理函数,这些函数将用于调用对话框中名称类似的那些函数。
3.4建立客户机与服务器之间的连接
为了完成连接,需要添加对套接字事件的处理函数,在对话框类中添加OnAccept()事件处理函数和OnConnect()事件处理函数。
如果现在可以编译和运行应用程序,就可以启动两个副本,把其中一个设置为侦听模式,然后把另一个应用程序与之相连接。
为此,先向对话框类()添加三个成员函数,这三个函数是套接字类()的事件处理函数需要调用的。
把三个函数的类型都指定为void,访问权限为公共。
指定第一个函数声明为OnSend(),第二个函数的声明为OnReceive,第三函数的声明为OnClose。
3.5发送和接收数据
如果两个应用程序间建立了连接,用户就能够在对话框窗口中的编辑框中输入文本消息,然后单击“发送”按钮,就应该可以把消息发送到另一个应用程序,一旦消息发送出去了,它将被添加到已发送消息的列表框中。
当“发送”按钮被单击之后,应用程序需要检查是否有消息输入了编辑框,获取该消息的长度,并发送该消息,然后把此消息添加到列表框中。
为了在应用程序中添加此项功能,使用ClassWizard向“发送”按钮(ID:
IDOK)的单击事件(BN—CLICKED)添加一个事件处理函数,注意不要接受默认的函数名,将函数名改成OnSendMsg(),编辑该函数。
对于消息的接收方,当套接字的OnReceive事件被触发时,表明一个消息已经到达了,可以用Receive()函数从套接字检索到该消息。
如果消息被顺利检索到,需要把接收的字符数组转换成Cstring类型,并把接收的消息添加到已接收的消息的列表框中。
通过编辑对话框类(CtalkDlg)的OnReceive()函数。
3.6终止连接
结束消息传送之后应该终止两个应用程序之间的连接,这个终止连接的操作是由客户机应用程序的用户通过单击“断开”按钮来实现的。
然后应用程序会接收到一个OnClose套接字事件。
和建立连接的过程相反,连接的套接字需要断开,发送消息的控件需要置为禁用状态。
在客户端,“连接”按钮控件由禁用状态变成可用,因为应用程序允许客户机程序改变某些参数,并打开与另一个服务器程序的连接。
同时,服务器应用程序继续侦听是否有其他的连接请求,侦听的端口等信息不变。
4结束语
这个应用程序在MFCWinSock编程中很有代表性,可以用于两台计算机之间进行字符串传输;创建思路简单,就是利用MFCAppWizard生成程序框架,通过对CAsynSocket类增加一个指向对话框类得指针,对CAsynSocket类中的一些事件处理函数进行重载,使这些套接字事件发生时,应用程序能够自动到对话框类中寻找合适的函数执行。
这个聊天室应用程序是基于客户/服务器模型的,一个服务器只能支持一个客户,因此它实际上是一个基于“点对点”模型的应用程序。
通过这个应用程序,用户可以在两台计算机之间进行字符串传输——即可以为两个人进行网上聊天提供服务,而且两个人的传输的字符串被保留在程序的列表框中,并且进行分类,分为传送和接收的字符串。
实验内容:
1.利用客户端和服务器模式,编写一个点对点的,可以相互发送和接收消息的程序,也就是常说的聊天工具。
2.该工具具有既可以作为服务器也可以做为客户端使用。
3.当作为服务器时,能输入IP值和端口值,并能进行在线侦听,能接受连接请求,并实现消息互发。
4.当作为客户端时,能输入服务器的IP值和端口值,并进行连接请求,能与服务器进行互发消息,聊天结束后还要实现与服务器的断开的功能。
三.实验方案与实验步骤
1.建立自己的socket类
从CAsyncSocket类继承
Eg.:
classCMySocket:
publicCAsyncSocket
添加套接字类事件处理函数
voidCMySocket:
:
OnAccept()
voidCMySocket:
:
OnClose()
voidCMySocket:
:
OnConnect()
voidCMySocket:
:
OnReceive()
这些函数系统会在有网络消息的时候自动调用它们。
最后还要在这个类中加入一个指向对话框类的指针作为成员变量,用作指向父对话框窗口的指针,来实现套接字类事件处理函数对话框类的相似成员函数的调用。
2.使用的函数
服务器端:
•建立Socket:
调用成员函数Socket()函数
•绑定端口:
调用成员函数bind()函数
•监听:
调用成员函数listen()函数
•服务器端接受客户端的连接请求:
调用成员函数accept()函数
•结束socket连接:
调用成员函数closesocket()
客户端:
•建立客户端的Socket:
调用socket()函数
•提出连接申请:
调用成员函数connect()函数
以上这些函数我们是在重载前面的虚拟函数时使用的,例如OnAccept()函数中调用accept()函数等等。
3.制作界面对话框类
使用的控件:
Listbox:
用于显示已发出和已接收的消息。
Combobox(orRadiobutton):
用于模式选择,客户机或服务器。
Editbox:
用于输入IP和端口。
Button:
控制命令按钮。
注意:
要在对话框类中添加两个我们自己的socket类作为成员变量。
因为当作为服务器时要有两个套接字。
一个用于侦听连接请求,一个用于被连接到另一个应用程序。
当然作为客户机时只要一个套接字就可以了。
四.实验设备与器材配置
1.实验室具有基于TCP/IP协议的Windows网络硬软件环境;
2.微机1台。
五.实验记录
实验截图:
1.初始化界面:
可以建立客户机和服务器两种套接子类型。
2.建立客户机和服务器后。
3.在客户机方面选择连接,服务器方面选择侦听,即可以进行相互通信。
由以下图可以看出,交互通信成功。
1)客户机发送消息,服务器成功接收。
2)服务器发送消息,客户机成功接收。
部分代码:
1.当接收不成功时,在用消息框提示"信息接收错误!
"的同时,用WSAGetLastError()给出错误的代码。
voidCTalkDlg:
:
OnReceive()
{
char*pBuf=newchar[1025];
intnBufSize=1024;
intnReceived;
CStringstrReceived;//接收消息
nReceived=m_sConnectSocket.Receive(pBuf,nBufSize);
if(nReceived!
=SOCKET_ERROR)//判断消息接收是否成功?
{pBuf[nReceived]=NULL;//保留接收消息的有效部分
strReceived=pBuf;//将消息转化为CString对象
m_listReceived.AddString(strReceived);//将消息添加到“已接收的消息”列表框
UpdateData(FALSE);}//更新对话框
else
{AfxMessageBox("信息接收错误!
",MB_OK|MB_ICONSTOP);
charc[10];//m_strMsg.Empty();//更新对话框
UpdateData(FALSE);//添加!
!
!
itoa(WSAGetLastError(),c,10);
AfxMessageBox(c,NULL,MB_OK);}
deletepBuf;
}
2.在发送空消息后,可以继续发送消息的修改如下:
voidCTalkDlg:
:
OnSendMsg()
{
intnLen;//消息长度
intnSent;//已发送消息的长度
UpdateData(TRUE);//从对话框取回数据
if(!
m_strMsg.IsEmpty())//判断要发送的消息是否为空{
nLen=m_strMsg.GetLength();//获取消息的长度
nSent=m_sConnectSocket.Send(LPCTSTR(m_strMsg),nLen);//发送消息
if(nSent!
=SOCKET_ERROR)//发送是否成功
{m_listSent.AddString(m_strMsg);//将消息添加到“已发送列表框”
UpdateData(FALSE);//更新对话框
}
else
{
AfxMessageBox("信息发送错误",MB_OK|MB_ICONSTOP);
charc[10];//m_strMsg.Empty();
//更新对话框
UpdateData(FALSE);//添加!
!
!
itoa(WSAGetLastError(),c,10);
AfxMessageBox(c,NULL,MB_OK);}
m_strMsg.Empty();//清除当前信息
UpdateData(FALSE);}//更新对话框
else{
m_strMsg.Empty();
UpdateData(FALSE);
}
}//更新对话框
六.实验总结
本次实验中编写的代码主要要完成一个聊天程序代码的编写,能实现客户端与服务器的双向消息联通,并有背景音乐的播放,经过这次实验,我进一步了解网络编程的过程。
加强了我对Windows环境下基于WinSock的编程方法和通讯的认识,以及对客户端和服务器模式的理解。
在本次试验中,我接触到了许多课本上没有的知识,丰富了我对计算机网络这门课的理解和认知,让我了解到更多计算机网络这门课在现实生活中的一些应用,对这门课的兴趣更加浓厚,也让我坚定了继续学好这门课的动力。
七.思考题或讨论题
1、本次实验所涉及的“实体”是什么?
实体间通过什么方式建立协议?
答:
实体是客户机和服务器。
TCP/IP应用服务采用客户机/服务器工作模式,服务器端启动守护进程,等待客户端的请求;服务器对应客户端的请求,派生子进程与客户进程进行数据通信,提供服务。
(1)服务器(HostA)首先要启动应用程序服务进程(守护进程Server),等待客户端的请求。
(2)当服务进程Server接收到客户端HostB的请求时,派生一个子进程(Child1)与HostB进行交互,实现数据通信,同时守护进程Server继续等待客户端的请求。
(3)当服务进程Server接收到客户端HostC的请求时,派生一个子进程(Child2)与HostC进行交互,实现数据通信,同时守护进程Server继续等待客户端的请求。
2.服务和协议的区别与联系?
本次实验的协议过程(即客户-服务器方式)是怎样建立的?
用哪那些服务?
答:
协议是规则,约定,而服务是功能,本领。
从层次上来说:
协议是通信双方对等层之间才有的,是水平方向上的关系。
而服务则是通信某一端上下层之间才有的,是垂直方向上的关系,而且是自下向上提供的。
客户-服务器方式的建立:
1)服务器建立socket套接字,并监听端口
2)客户端建立套接字
3)客户端向服务器发送连接请求
4)服务器监听到连接请求,建立一个新的套接字响应客户端,并用这个套接字和客户端进行收发通讯
本次实验,使用的服务是接收消息服务和发送消息服务。
3.本次实验的协议提供了什么服务?
试想,用此协议还可以提供怎样的服务?
这种服务在自动化学科领域的意义是什么?
答:
本次实验协议提供了两台主机通讯的服务,还可以实现多台主机之间在一个平台上进行通讯。
这种服务在自动化领域的意义在于可以从上位机来控制多个机器,将多个机器连接起来进行通讯。
实现了一个和多个机器的控制问题。
本次试验是用了TCP/IP协议,这个协议提供了比较多的服务,大致如下:
FTP(FileTransferProtocol)是文件传输协议,一般上传下载用FTP服务,数据端口是20H,控制端口是21H。
Telnet服务是用户远程登录服务,使用23H端口,使用明码传送,保密性差、简单方便。
DNS(DomainNameService)是域名解析服务,提供域名到IP地址之间的转换。
SMTP(SimpleMailTransferProtocol)是简单邮件传输协议,用来控制信件的发送、中转。
POP3(PostOfficeProtocol3)是邮局协议第3版本,用于接收邮件。
对自动化学科的意义:
TCP/IP协议不依赖于任何特定的计算机硬件或操作系统,提供开放的协议标准,即使不考虑Internet,TCP/IP协议也获得了广泛的支持。
所以TCP/IP协议成为一种联合各种硬件和软件的实用系统。
TCP/IP协议并不依赖于特定的网络传输硬件,所以TCP/IP协议能够集成各种各样的网络。
用户能够使用以太网(Ethernet)、令牌环网(TokenRingNetwork)、拨号线路(Dial-upline)、X.25网以及所有的网络传输硬件。
统一的网络地址分配方案,使得整个TCP/IP设备在网中都具有惟一的地址。
标准化的高层协议,可以提供多种可靠的用户服务。
IP传输通用数据。
数据能够用于任何目的,并且能够很轻易地取代以前由专有数据网络传输的数据。
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 08011302 第三次 实验
![提示](https://static.bdocx.com/images/bang_tan.gif)