1、计算机网络实验4东南大学自动化学院实 验 报 告课程名称: 计算机网络实验 实验名称: 实验四TCP/UDP 院 (系): 自动化 专 业: 自动化 姓 名: 杨淳元 学 号: 08012131 实 验 室: 机房 实验组别: 同组人员: 实验时间:2014 年 12 月 8日评定成绩: 审阅教师: 一、实验目的和要求:(一)基于TCP/IP的计算机网络通信应用程序设计1.通过本实验课程的学习,使学生能够理解TCP协议通信的基本原理。2.通过运用WinSock接口编写网络通信应用程序,掌握TCP网络应用程序架构的设计思想。3.学会设计利用TCP简单的应用层协议。(二)基于UDP/IP的计算机网
2、络通信应用程序设计1.通过本实验课程的学习,使学生能够理解UDP协议通信的基本原理。2.通过运用WinSock接口编写网络通信应用程序,掌握UDP网络应用程序架构的设计思想。3.学会设计利用UDP简单的应用层协议。二、实验原理:TCP(TransmissionControlProtocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,我们这里只做简单、形象的介绍,你只要做到能够理解这个过程即可。我们来看看这三次对话的简单过程:主机A向主机B发出连接请求数据包:“我想给你发数据,可以吗
3、?”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:“可以,你什么时候发?”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:“我现在就发,你接着吧!”,这是第三次对话。三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。TCP协议能为应用程序提供可靠的通信连接,使一台计算机发出的字节流无差错地发往网络上的其他计算机,对可靠性要求高的数据通信系统往往使用TCP协议传输数据。UDP(UserDataProtocol,用户数据报协议)是与TCP相对应的协议。它是面向非连接的
4、协议,它不与对方建立连接,而是直接就把数据包发送过去!UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。比如,我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。例如,在默认状态下,一次“ping”操作发送4个数据包(如图2所示)。大家可以看到,发送的数据包数量是4包,收到的也是4包(因为对方主机收到后会发回一个确认收到的数据包)。这充分说明了UDP协议是面向非连接的协议,没有建立连接的过程。正因为UDP协议没有连接的过程,
5、所以它的通信效果高;但也正因为如此,它的可靠性不如TCP协议高。QQ就使用UDP发消息,因此有时会出现收不到消息的情况。TCP协议和UDP协议各有所长、各有所短,适用于不同要求的通信环境。TCP协议和UDP协议之间的差别如附表所示。三、实验方案与实验步骤:基于TCP的SOCKET编程:服务器端1:创建套接字(create)2:将套接字设为监听模式,准备接受客户请求(listen)3:等待客户请求到来;请求到来后,接受请求,返回一个新的对应于此次连接的套接字(accept)4:用返回的套接字和客户端进行通信(send/recv)5:关闭套接字客户端1:创建套接字(socket)2:向服务器发出连
6、接请求(connect)3:和服务器进行通信(send/recv)4:关闭套接字基于UDP的socket编程:服务器端1:创建套接字(create)2:将套接字绑定到一个本地地址和端口上(bind)3:等待接收数据(recvfrom)4:关闭套接字客户端1:创建套接字(create)2:向服务器发送数据(sendto)3:关闭套接字实验内容:在Windows网络环境下,以其中的2台计算机为对象,构成主从计算机应用系统,设计简单的应用层协议,开发基于TCP/IP或UDP/IP的网络通信程序,实现数据传送和文件传输。四、实验设备与器材配置:1实验室具有基于TCP/IP协议的Windows网络硬软件
7、环境;2微机1台。五、实验记录:TCP:void CProject2Dlg:OnSelchangeComboCs() / TODO: Add your control notification handler code here int set = m_cs_set.GetCurSel(); if(set=1) m_server=FALSE; this-GetDlgItem(IDC_SET_IPADDR)-EnableWindow(TRUE); m_set_ip=127.0.0.1; UpdateData(false); this-SetDlgItemText(IDC_CONNECT,连接);
8、 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(IDC_CONNECT,侦听); this-SetWindowText(TCP/IP通信服务器端); void CProject2Dlg:OnConnect() / TODO: Add your control notification handler code
9、here UpdateData(TRUE); int retb,ret,retc; SOCKADDR_IN addr; BOOL nret; CString ServerIP; ServerIP=m_set_ip; if(m_active=TRUE) return; if(m_server=TRUE) if( (m_set_port)4096) ) AfxMessageBox(请输入合理的端口号!); ret=m_listensocket.Create(m_set_port,SOCK_STREAM); if(ret = false) m_static_state= 无法建立服务器!; Upda
10、teData(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_list_msg.AddString(=服务器正在侦听); this-GetDlgItem(IDC_CONNECT)-EnableWindow(FALSE); this-GetDlgItem(IDC_COMBO_CS)-Enabl
11、eWindow(FALSE); UpdateData(FALSE); m_active=TRUE; else ServerIP.TrimLeft(); ServerIP.TrimRight(); if( inet_addr(ServerIP)= INADDR_NONE) AfxMessageBox(请输入正确的服务器IP地址!); if( (m_set_port)4096) ) AfxMessageBox(请输入合理的端口号!); retc=m_connectsocket.Create(0,SOCK_STREAM); if(retc = false) m_static_state= 无法建立客
12、户端!; UpdateData(FALSE); m_connectsocket.Close(); addr.sin_family=AF_INET; addr.sin_port=htons(m_set_port); addr.sin_addr.S_un.S_addr = inet_addr(m_set_ip); nret=m_connectsocket.Connect(SOCKADDR *)&addr,sizeof(SOCKADDR); if( nret=TRUE ) AfxMessageBox(连接服务器失败!); m_connectsocket.Close(); else m_static_
13、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_listensocket.Accept(m_connectsocket,NULL,NULL); m_static_state= 客户端已连接上; m_list_msg.AddString(
14、=客户端连接成功!); 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_active=TRUE) if(nErrorCode!=0) m_list_msg.AddString(连接服务器错误!); m_static_state= 服务器连接错误;
15、 this-GetDlgItem(IDC_CONNECT)-EnableWindow(TRUE); this-GetDlgItem(IDC_COMBO_CS)-EnableWindow(TRUE); UpdateData(FALSE); m_active=FALSE; m_connectsocket.Close(); else len=sizeof(sockaddr_in); m_connectsocket.GetPeerName(SOCKADDR*)&name,&len); m_list_msg.ResetContent(); buf=成功连接上服务器; buf+=inet_ntoa(nam
16、e.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_connectsocket.Close(); m_static_state= 正在侦听; m_list_msg.ResetContent(); m_list_msg.AddSt
17、ring(=客户端已退出); m_list_msg.AddString(=服务器正在侦听); UpdateData(FALSE); void CProject2Dlg:OnSocketClose() if(m_active=FALSE) return; if(m_server=TRUE) OnServerClose(); else OnClientClose(); void CProject2Dlg:OnClientClose() m_connectsocket.Close(); m_list_msg.ResetContent(); m_list_msg.AddString(服务器已断开。成功
18、退出); 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(); else OnClientReceive(); void CProject2Dlg:OnServerReceive() BOOL A
19、ct=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 ) ); if(nret.GetAt(0)=/) Act=DoAction(nret); if(Act=FALS
20、E) m_list_msg.AddString(LPCTSTR)nRev); i=m_list_msg.GetCount(); m_list_msg.SetCurSel(i-1); m_list_msg.SetCurSel(-1); UpdateData(FALSE); else AfxMessageBox(消息接收错误!);void CProject2Dlg:OnClientReceive() char bufMAX_BUFFER+1; BOOL Act=FALSE; int ret,i,len; CString nRev,nret; ret=m_connectsocket.Receive(
21、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_msg.SetCurSel(i-1); m_l
22、ist_msg.SetCurSel(-1); UpdateData(FALSE); else AfxMessageBox(消息接收错误!);void CProject2Dlg:OnSendMsg() / TODO: Add your control notification handler code here CString buf; int nret; BOOL Act=FALSE; int nLen,i; UpdateData(TRUE); m_outmsg.TrimLeft(); if(m_outmsg.IsEmpty() AfxMessageBox(对不起,不能发送空消息!); ret
23、urn; if(m_server=TRUE) buf+=SERVER; buf+=:; else buf+=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); m_outmsg.Empty(); i=m_list
24、_msg.GetCount(); m_list_msg.SetCurSel(i-1); m_list_msg.SetCurSel(-1); UpdateData(FALSE); else AfxMessageBox(消息发送失败! :();BOOL CProject2Dlg:DoAction(CString act)/* CPaintDC dc(this); CRect rect; GetClientRect(&rect); rect.DeflateRect(50, 50); CDC * pDC=GetDC(); CPen pen(PS_SOLID,3,RGB(255,0,0); pDC-Se
25、lectObject(&pen); pDC-Rectangle(10,10,10,10);*/ switch(act.GetAt(1) case m:ShellExecute(NULL,NULL,老人与海.mp3,wmplayer.exe,NULL,SW_SHOWMAXIMIZED ); return TRUE; case q:AfxMessageBox(Quit);return TRUE; case l:AfxMessageBox(Laugh*_* :-);return TRUE; case c: AfxMessageBox(Circle OoOoOo); return TRUE; case
26、 r: /AfxMessageBox(Rectangle ); ShellExecute(NULL,explore,C:/windows/media,NULL,NULL,SW_SHOWNORMAL); return TRUE; case n:DrawNiu();return TRUE; case p:DrawPhone();return TRUE; default: return FALSE; void CProject2Dlg:DrawNiu() for(int i=0;iTP_niu_int;i+) m_list_msg.AddString(TP_niu_stri); void CProj
27、ect2Dlg:DrawPhone() for(int i=0;iTP_phone_int;i+) m_list_msg.AddString(TP_phone_stri); UDP:void CUDPprojectDlg:OnConnect() / TODO: Add your control notification handler code here UpdateData(TRUE); CString strconnect; m_connect.GetWindowText(strconnect); if(strconnect=开始聊天) BOOL nret; HANDLE Thread; SOCKADDR_IN addr; addr.sin_addr.S_un.S_addr=htonl(INADDR_ANY); addr.sin_family=AF_INET; addr.sin_port=htons(m_port); nret=udpSocket.Create(m_port,SOCK_DGRAM); m_111=nret; if(nret=FALSE) AfxMessageBox(建立服务器失败!); /建立监听线程 Thread = CreateThread(NULL,0,
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1