东南大学计算机与网络第四次实验_第1页
东南大学计算机与网络第四次实验_第2页
东南大学计算机与网络第四次实验_第3页
东南大学计算机与网络第四次实验_第4页
东南大学计算机与网络第四次实验_第5页
免费预览已结束,剩余15页可下载查看

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、东南大学自动化学院实验报告课程名称:信息通信网络概论第 4 次实验实验名称:设计协议院 (系):自动化专业:自动化姓名:学号:实验室:金智楼实验组别:同组人员:实验时间:2013年 12月 23 日评定成绩:审阅教师:目录一实验目的和要求 ,3二实验原理 ,3三实验方案与实验步骤 ,4四实验设备与器材配置 ,5五实验记录 ,5六实验总结 ,9七思考题或讨论题 ,9- 2 -一实验目的和要求目的:1.设计简单的应用层协议,2.开发基于 TCP/IP 或 UDP/IP 的网络通信程序,实现数据传送和文件传输。要求:1.正确理解应用层协议的概念;2.更深入了解客户 /服务器模式的网络程序设计。二实验

2、原理1.应用层协议应用层协议的定义包括如下内容:(1) 交换的报文类型,如请求报文和响应报文;(2) 各种报文类型的语法,如报文中的各个字段公共详细描述;(3) 字段的语义,即包含在字段中信息的含义;(4) 进程何时、如何发送报文及对报文进行响应。有些应用层协议是由RFC 文档定义的,因此它们位于公共领域。例如,web 的应用层的协议HTTP(超文本传输协议, RFC 2616) 就作为一个 RFC 供大家使用。如果浏览器开发者遵从HTTPRFC 规则,所开发出的浏览器就能访问任何遵从该文档标准的web,服务器并获取相应的web页面。还有很多别的应用层协议是专用的不能随意应用于公共领域。例如,

3、很多现有的 P2P文件共享系统使用的是专用应用层协议。目的,应用层协议主要有以下几种。2) SOCKET 编程服务器要创建一个用于侦听的套接字,为该套接字分配地址之后,调用 listen()函数使它处于侦听状态;客户机在创建套接字完毕后,为套接字分配地址,然后调用connect() 函数,请求与服务器套接字连接;服务器套接字在收到客户机的连接请示后,调用accept()函数, 该函数创建一个用于连接的套接字。应用该套接字和客户机上的连接套接字,用户就可以在服务器和客户机之间进行数据传输了。在结束传输之后,客户机调用closesocket()函数关闭套接字,服务器也调用该函数关闭用于侦听和连接的

4、套接字。- 3 -客户机服务器侦听套接字连接套接字Socket()Socket()Bind()Bind()Listen()Connect()Accept()创建连接套接字Send()Recv()Recv()Send()Closesocket()Closesocket()Closesocket()三实验方案与实验步骤1.基于 TCP 的 socket 编程1)服务端1)建立 Socket 初始化 WinSock 的动态连接库后,需要在服务器端建立一个监听的Socket ,为此可以调用 Socket()函数用来建立这个监听的Socket ,并定义此 Socket所使用的通信协议。此函数调用成功返回

5、Socket 对象,失败则返回INVALID_SOCKET(调用 WSAGetLastError() 可得知原因, 所有 WinSocket 的函数都可以使用这个函数来获取失败的原因 ) 。2)绑定端口接下来要为服务器端定义的这个监听的Socket 指定一个地址及端口(Port ),这样客户端才知道待会要连接哪一个地址的哪个端口,为此我们要调用bind() 函数,该函数调用成功返回 0,否则返回 SOCKET_ERROR。监听 当服务器端的 Socket 对象绑定完成之后 , 服务器端必须建立一个监听的队列来接收客户端的连接请求。 listen() 函数使服务器端的 Socket 进入监听状态

6、,并- 4 -设定可以建立的最大连接数 ( 目前最大值限制为 5, 最小值为 1) 。该函数调用成功返回0,否则返回 SOCKET_ERROR。服务器端的 Socket 调用完 listen ()后,如果此时客户端调用 connect ()函数提出连接申请的话, Server 端必须再调用 accept() 函数,这样服务器端和客户端才算正式完成通信程序的连接动作。为了知道什么时候客户端提出连接要求,从而服务器端的Socket 在恰当的时候调用 accept()函数完成连接的建立,我们就要使用WSAAsyncSelect()函数,让系统主动来通知我们有客户端提出连接请求了。该函数调用成功返回0

7、,否则返回SOCKET_ERROR。4)服务器端接受客户端的连接请求当 Client 提出连接请求时,Server端 hwnd 视窗会收到 Winsock Stack送来我们自定义的一个消息,这时,我们可以分析lParam ,然后调用相关的函数来处理此事件。为了使服务器端接受客户端的连接请求,就要使用 accept() 函数,该函数新建一 Socket 与客户端的 Socket 相通,原先监听之Socket 继续进入监听状态, 等待他人的连接要求。 该函数调用成功返回一个新产生的 Socket 对象,否则返回 INVALID_SOCKET。结束 socket连接结束服务器和客户端的通信连接是很

8、简单的,这一过程可以由服务器或客户机的任一端启动, 只要调用 closesocket() 就可以了,而要关闭 Server 端监听状态的 socket ,同样也是利用此函数。客户端%建立客户端的 Socket 客户端应用程序首先也是调用WSAStartup()函数来与Winsock 的动态连接库建立关系,然后同样调用 socket()来建立一个 TCP 或 UDPsocket (相同协定的 sockets 才能相通, TCP 对 TCP, UDP 对 UDP)。与服务器端的 socket 不同的是,客户端的 socket 可以调用 bind() 函数,由自己来指定 IP 地址及port 号码;

9、但是也可以不调用 bind() ,而由 Winsock 来自动设定 IP 地址及 port 号码。2)提出连接申请客户端的 Socket 使用 connect() 函数来提出与服务器端的Socket建立连接的申请,函数调用成功返回0,否则返回 SOCKET_ERROR。lleted_92ee3876-c0cb-4c7e-85ab-3a2b5523d757-Bulleted_07%5030878-a36f-444f-a9b2-2e086501a1cc-Bulleted_7eb03016-e171-4a74数据的传送 虽然基于 TCP/IP 连接协议 (流套接字) 的服务是设计客户机 / 服务器应

10、用程序时的主流标准,但有些服务也是可以通过无连接协议(数据报套接字)提供的。2.基于 UDP 的 socket 编程服务器端1:创建套接字(create)2:将套接字绑定到一个本地地址和端口上(bind )3:等待接收数据(recvfrom )4:关闭套接字客户端1:创建套接字(create )2:向服务器发送数据(sendto)3:关闭套接字四实验设备与器材配置计算机一台、软件Microsoft Visual Studio 6.0- 5 -五实验记录打开两个应用程序,一个选择“服务器” ,并且点击“侦听” ;另外一个选择“客户端” ,并且点击“连接” ,此时两个程序的消息发送窗口的信息框变为

11、可写,输入消息可以进行客户端 -服务器之间的发送和接收,发送和接收的消息可以存储在信息框内。- 6 -客户端和服务器端可以互发信息:输入框输入/n 和 /p,接收到的为指定的图像:- 7 -主要代码如下:- 8 -void CProject2Dlg:OnSelchangeComboCs()dc5-9da2-0c6f4fe60ac6-Bulleted_fdd54282-3d1a-4d68-b7 TODO: Add your control notification handler code here intset = m_cs_set.GetCurSel();if(set=1)m_server=

12、FALSE; this-GetDlgItem(IDC_SET_IPADDR)-EnableWindow(TRUE); m_set_ip=;UpdateData(false); this-SetDlgItemText(IDC_CONNECT, 连接 ); this-SetWindowText(TCP/IP 通信客户端 );else if(set=0)m_server=TRUE;m_set_ip= ;this-GetDlgItem(IDC_SET_IPADDR)-EnableWindow(FALSE);UpdateData(FALSE);this-SetDlgItemText(I

13、DC_CONNECT,侦听 );this-SetWindowText(TCP/IP通信服务器端);void CProject2Dlg:OnConnect()TODO: Add your control notification handler codehere UpdateData(TRUE);int retb,ret,retc;SOCKADDR_IN addr;BOOL nret; CStringServerIP;ServerIP=m_set_ip;if(m_active=TRUE)return;if(m_server=TRUE)if( (m_set_port)4096) )AfxMessa

14、geBox( 请输入合理的端口号!);- 9 -ret=m_listensocket.Create(m_set_port,SOCK_STREAM);if(ret = false)m_static_state=无法建立服务器!;UpdateData(FALSE);m_listensocket.Close();retb=m_listensocket.Listen(5);if(retb=false)m_static_state=无法侦听 !;UpdateData(FALSE);m_static_state= 服务器建立成功 ! 正在侦听 ,;m_list_msg.ResetContent();m_l

15、ist_msg.AddString(= 服务器正在侦听,);this-GetDlgItem(IDC_CONNECT)-EnableWindow(FALSE);this-GetDlgItem(IDC_COMBO_CS)-EnableWindow(FALSE);UpdateData(FALSE);m_active=TRUE;elseServerIP.TrimLeft();ServerIP.TrimRight();if( inet_addr(ServerIP)= INADDR_NONE)AfxMessageBox( 请输入正确的服务器IP 地址 !);if( (m_set_port)4096) )A

16、fxMessageBox( 请输入合理的端口号!);retc=m_connectsocket.Create(0,SOCK_STREAM);if(retc = false)m_static_state=无法建立客户端!;UpdateData(FALSE);m_connectsocket.Close();addr.sin_family=AF_INET;-10-addr.sin_port=htons(m_set_port);addr.sin_addr.S_un.S_addr = inet_addr(m_set_ip);nret=m_connectsocket.Connect(SOCKADDR *)&

17、amp;addr,sizeof(SOCKADDR);if(nret=TRUE )AfxMessageBox( 连接服务器失败!);m_connectsocket.Close();elsem_static_state=正在连接服务器,;this-GetDlgItem(IDC_CONNECT)-EnableWindow(FALSE);this-GetDlgItem(IDC_COMBO_CS)-EnableWindow(FALSE);UpdateData(FALSE);m_active=TRUE;void CProject2Dlg:OnServerAccept()if(m_active=TRUE)m

18、_listensocket.Accept(m_connectsocket,NULL,NULL);m_static_state=客户端已连接上;m_list_msg.AddString(= 客户端连接成功!);UpdateData(FALSE);CString welcome(Welcome my friend!);m_connectsocket.Send(welcome,welcome.GetLength();void CProject2Dlg:OnClientConnect(int nErrorCode)sockaddr_in name;int len;CString buf;if(m_ac

19、tive=TRUE)if(nErrorCode!=0)m_list_msg.AddString( 连接服务器错误!);-11-m_static_state=服务器连接错误,;this-GetDlgItem(IDC_CONNECT)-EnableWindow(TRUE);this-GetDlgItem(IDC_COMBO_CS)-EnableWindow(TRUE);UpdateData(FALSE);m_active=FALSE;m_connectsocket.Close();elselen=sizeof(sockaddr_in);m_connectsocket.GetPeerName(SOC

20、KADDR*)&name,&len);m_list_msg.ResetContent();buf= 成功连接上服务器;buf+=inet_ntoa(name.sin_addr);m_list_msg.AddString(buf);m_static_state=服务器连接成功!;UpdateData(FALSE);CString welcome(I am );welcome+=CLIENT;m_connectsocket.Send(welcome,welcome.GetLength();void CProject2Dlg:OnServerClose()m_connectsocke

21、t.Close();m_static_state=正在侦听,;m_list_msg.ResetContent();m_list_msg.AddString(=客户端已退出,);m_list_msg.AddString(=服务器正在侦听,);UpdateData(FALSE);void CProject2Dlg:OnSocketClose()if(m_active=FALSE)return;if(m_server=TRUE)OnServerClose();else-12-OnClientClose();void CProject2Dlg:OnClientClose()m_connectsocke

22、t.Close();m_list_msg.ResetContent();m_list_msg.AddString( 服务器已断开。成功退出,);m_static_state=已断开连接,;this-GetDlgItem(IDC_CONNECT)-EnableWindow(TRUE);this-GetDlgItem(IDC_COMBO_CS)-EnableWindow(TRUE);UpdateData(FALSE);m_active=FALSE;void CProject2Dlg:OnSocketReceive()if(m_server=TRUE)OnServerReceive();elseOn

23、ClientReceive();void CProject2Dlg:OnServerReceive()BOOL Act=FALSE;CString nRev,nret;char bufMAX_BUFFER+1;int ret,i,len;ret=m_connectsocket.Receive(buf,MAX_BUFFER,0);if(ret!=SOCKET_ERROR)bufret=NULL;nRev=buf;nret+=CLIENT;nret+=:;len=nret.GetLength();nret=nRev.Right( ( (nRev.GetLength()-len ) );-13-if

24、(nret.GetAt(0)=/)Act=DoAction(nret);if(Act=FALSE)m_list_msg.AddString(LPCTSTR)nRev);i=m_list_msg.GetCount();m_list_msg.SetCurSel(i-1);m_list_msg.SetCurSel(-1);UpdateData(FALSE);elseAfxMessageBox( 消息接收错误!);void CProject2Dlg:OnClientReceive()char bufMAX_BUFFER+1;BOOL Act=FALSE;int ret,i,len;CString nR

25、ev,nret;ret=m_connectsocket.Receive(buf,MAX_BUFFER,0);if(ret!=SOCKET_ERROR)bufret=NULL;nRev=buf;nret+=SERVER;nret+=:;len=nret.GetLength();nret=nRev.Right( ( (nRev.GetLength()-len ) );if(nret.GetAt(0)=/)Act=DoAction(nret);if(Act=FALSE)m_list_msg.AddString(LPCTSTR)nRev);i=m_list_msg.GetCount();m_list_

26、msg.SetCurSel(i-1);m_list_msg.SetCurSel(-1);UpdateData(FALSE);-14-elseAfxMessageBox( 消息接收错误!);void CProject2Dlg:OnSendMsg()TODO: Add your control notification handler codehere CString buf;int nret;BOOL Act=FALSE;int nLen,i;UpdateData(TRUE);m_outmsg.TrimLeft();if(m_outmsg.IsEmpty()AfxMessageBox( 对不起,

27、不能发送空消息!);return;if(m_server=TRUE)buf+=SERVER;buf+=:;elsebuf+=CLIENT;buf+=:;buf+=m_outmsg;nLen=buf.GetLength();nret = m_connectsocket.Send(LPCTSTR)buf,nLen);if(nret!=SOCKET_ERROR)if(m_outmsg.GetAt(0)=/)Act=DoAction(m_outmsg);if(Act=FALSE)m_list_msg.AddString(LPCTSTR)buf);-15-m_outmsg.Empty();i=m_lis

28、t_msg.GetCount();m_list_msg.SetCurSel(i-1);m_list_msg.SetCurSel(-1);UpdateData(FALSE);elseAfxMessageBox( 消息发送失败!:();m_sListenSocket.Accept(m_sConnectSocket);/激活消息输入和相关控件GetDlgItem(IDC_EDIT_MSG)-EnableWindow(TRUE);GetDlgItem(IDOK)-EnableWindow(TRUE);GetDlgItem(IDC_STATIC_MSG)-EnableWindow(TRUE);void

29、CTalkDlg:OnConnect()/对于客户机GetDlgItem(IDC_EDIT_MSG)-EnableWindow(TRUE);GetDlgItem(IDOK)-EnableWindow(TRUE);GetDlgItem(IDC_STATIC_MSG)-EnableWindow(TRUE);GetDlgItem(IDC_BTN_CLOSE)-EnableWindow(TRUE);void CTalkDlg:OnReceive()char* pBuf = new char1025;/char pBuf1025;int nBufSize = 1024;int nReceived;CSt

30、ring strReceived;/接收消息nReceived = m_sConnectSocket.Receive(pBuf,nBufSize);/判断消息接收是否成功?if(nReceived!=SOCKET_ERROR)/保留接收消息的有效部分pBufnReceived = NULL;/将消息转化为CString 对象strReceived = pBuf;/将消息添加到“已接收的消息”列表框m_listReceived.AddString(strReceived);/更新对话框UpdateData(FALSE);-16-elseAfxMessageBox( 信息接收错误!,MB_OK|M

31、B_ICONSTOP);delete pBuf;void CTalkDlg:OnSendMsg()int nLen;/ 消息长度int nSent;/已发送消息的长度/从对话框取回数据UpdateData(TRUE);/判断要发送的消息是否为空if(!m_strMsg.IsEmpty()/获取消息的长度nLen = m_strMsg.GetLength();/发送消息nSent = m_sConnectSocket.Send(LPCTSTR(m_strMsg),nLen);/发送是否成功if(nSent!=SOCKET_ERROR)将消息添加到“已发送列表框”m_listSent.AddStr

32、ing(m_strMsg);更新对话框UpdateData(FALSE);elseAfxMessageBox( 信息发送错误 ,MB_OK|MB_ICONSTOP);/清除当前信息m_strMsg.Empty();/更新对话框UpdateData(FALSE);void CTalkDlg:OnClose()/关闭连接的套接字m_sConnectSocket.Close();/禁用消息输入和发送的相关控件GetDlgItem(IDC_EDIT_MSG)-EnableWindow(FALSE);GetDlgItem(IDOK)-EnableWindow(FALSE);-17-GetDlgItem(

33、IDC_STATIC_MSG)-EnableWindow(FALSE);GetDlgItem(IDC_BTN_CLOSE)-EnableWindow(FALSE);/清除列表框内容while(m_listSent.GetCount()!=0)m_listSent.DeleteString(0);while(m_listReceived.GetCount()!=0)m_listReceived.DeleteString(0);/是否为客户机if(m_cmbType.GetCurSel()=0)/对于客户机/激活与连接设置相关的控件GetDlgItem(IDC_BTN_CONNECT)-Enabl

34、eWindow(TRUE);GetDlgItem(IDC_EDIT_SERVNAME)-EnableWindow(TRUE);GetDlgItem(IDC_EDIT_SERVPORT)-EnableWindow(TRUE);GetDlgItem(IDC_STATIC_SERVNAME)-EnableWindow(TRUE);GetDlgItem(IDC_STATIC_SERVPORT)-EnableWindow(TRUE);GetDlgItem(IDC_STATIC_TYPE)-EnableWindow(TRUE);GetDlgItem(IDC_COMBO_TYPE)-EnableWindow(TRUE);六

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论