东南大学计算机网络第四次实验报告.docx
东南大学自动化学院实验报告课程名称:信息通信网络概论第4次实验实验名称: 实验四、计算机网络通信应用程序设计院(系):自动化专 业:自动化姓 名:学 号:实验室:金智楼实验组别:同组人员: 实验时间:2016年12月20日评定成绩:审阅教师:目 录(一)基于TCP/IP的计算机网络通信应用程序设计一 .实验目的和要求3二 .实验原理3三 .实验方案与实验步骤3四 .实验设备与器材配置4五 .实验记录4六 .实验总结11附录:局部代码(二)基于UDP/IP的计算机网络通信应用程序设计七 .实验目的和要求17八 .实验原理17九 .实验方案与实验步骤 17十 实验设备与器材配置18十一 实验记录18二、实验原理UDP是无连接通信协议,UDP不保证可靠数据的传输,但能够向假设干个目标发送数据, 接收发自假设干个源的数据。简单地说,如果一个主机向另外一台主机发送数据,这一数据 就会立即发出,而不管另外一台主机是否已准备接收数据。如果另外一台主机收到了数据, 它不会确认收到与否。三、实验方案与实验步骤服务器端1 .创立套接字并将套接字绑定到一个本地地址和端口上(create);2 .等待接收数据(ReceiveFrom);3 .关闭套接字。客户端1 .创立套接字(create);2 .向服务器发送数据(sendto);3 .关闭套接字。四、实验设备与器材配置电脑、VC6. 0五、实验记录1、界面(1)输入:IP设置、端口设置、输入内容;(2)输出显示:消息列表;(3)按钮:发送、清空列表、导出消息记录、退出。图5.1界面设计2、功能描述(1) 初始化:客户机输入服务器后,点击开始聊天。(a)客户端初始化(b)服务器初始化图5. 2初始化(2)客户机与服务器对话:此时服务器并没有填写客户机的IP地址,能够接收到客户 机发送的消息,并且获得发送方IP。但是不能发送消息给客户机,只有填写客户 机IP223. 3. 210. 241后,才能发送消息给客户机。(a)客户机端界面(b)服务器端界面图5. 3客户机与服务器对话(a)客户机端界面(b)服务器端界面图5. 3客户机与服务器对话(3)输入/n在聊天对话框画一个牛,输入/p画一个 图5. 4字符画(4)输入/r会翻开一个windows资源管理器,并翻开指定的路径,当前设置的路径为:C:/windows/media图5.7输入/r翻开一个windows资源管理器3、改进(1)添加发送时间通过函数time。、localtimeO获得当前系统时间,能够显示发送接收时间,格式 为年/月/日时/分/秒,添加到接收信息列表中信息首部。(2)清空列表通过函数m_list. ResetContent ()实现清空列表。(3)导出消息记录通过函数mist_msg.GetText()把列表中的信息写入字符串中,再利用文件读写函 数fopen()、fwriteO > fcloseO将字符串写入指定文件中。图5. 8导出消息记录到txt中(4)输入/e翻开指定网址,输入/t翻开指定图片图5. 9输入指定字符执行相应的操作(5)添加背景图片、改变控件背景色、字体等。方法与实验(一)中相同,不再赘述。图5. 10其他功能六、实验总结在原有程序的基础上,增加了保存消息记录、自定义协议等功能,同时修改了界面, 但是对于MFC中按钮的界面设置仍然不太了解,尝试直接在WM_CTLCOLOR消息自动生成 OnCtlColorO函数中进行设置,没有到达预期效果,希望在以后的学习过程中能够学到并 解决这个问题。通过这次实验,我对TCP协议和UDP协议各自的特点有了一定理解,能够判断在不同 场合下应使用哪个协议,掌握并理解了它们的区别和各自的优缺点。七、思考题或讨论题1、结合所学知识与实验中的感受,说明TCP协议和UDP协议各自的优 缺点。在工业控制的现场中,要通过网络控制一台焊接机器人的运 行,要求控制数据能正确传输。试分析说明,采用哪种运输层协议 比拟好?另外,网络中使用的IP 服务采用的是哪种运输层协 议?为什么要采用这种协议?并说明理由。(1)TCP协议和UDP协议各自的优缺点:TCP-有连接,所以握手过程会消耗资源, 过程为可靠连接,不会丧失数据,适合大数据量交换;UDP-非可靠连接,会丢包, 没有校验,速度快,无须握手过程;tcp需要首先建立连接,而udp只要绑定 端口发送就行,tcp如果建立连接以后,能够保证传送的数据包次序,而udp 那么不能保证数据包到达的先后次序,甚至会丢包;编程时,TCP面向连接的, 即每次收发数据之前必须通过connect建立连接,也是双向的,即任何一方 都可以收发数据,协议本身提供了一些保障机制保证它是可靠的、有序的, 即每个包按照发送的顺序到达接收方。UDP它是无连接的,不可靠的,因为通 讯双方发送数据后不知道对方是否已经收到数据,是否正常收到数据。任何 一方建立一个socket以后就可以用sendto发送数据,也可以用recvfrom接 收数据。根本不关心对方是否存在,是否发送了数据。它的特点是通讯速度 比拟快。(2)应采用TCP协议,TCP-有连接,过程为可靠连接,不会丧失数据,能保证数据 正确传输。(3)网络中使用的IP 服务采用的是UDP协议,IP 是实时传输,必须使用 UDPo UDP不保证可靠交付,但UCP比TCP的开销要小很多,IP 接受这样的服务质量就可以使用UDPo2、思考和调研目前常用的通信工具之一:QQ的基本实现方式。考虑其 各种不同的应用可能采取的是TCP和UDP中的哪种协议。如果需要 对本实验结果进行进一步改进,有哪些想法。附录:(局部代码)1、清空列表void CUDPprojectDlg:OnDelete()(/ TODO: Add your control notification handler code here m_list_msg,ResetContent(); 清空歹 U 表)2、导出消息记录void CUDPprojectDlg:OnDownload()(/ TODO: Add your control notification handler code hereCString content;CString temp;for(int i=0;i<m_list_msg.GetCount();i+) (m_list_msg,GetText(i,temp);将列表中内容写入字符串temp content+=temp;content+=,rnn;)FILE*fp;fp = fopen(”f:消息记录.txt",翻开指定目录fwrite(content, strlen(content), 1, fp);写入字符串 fclose(fp);)3、自定义指定操作void CUDPprojectDlg:DoAction(LPVOID IParam, char str) (CUDPprojectDIg *pDlg = (CUDPprojectDlg*)IParam;switch(str) (case 'n': pDlg->DrawNiu();break;case 'z': pDlg->DrawPig();break;case 'p': pDlg->DrawPhone();break;case'e'rShellExecutefNULLJ'open","", NULL, NULL, SW_SHOWNORMAL);break; 翻开网址case t: ShellExecute(NULL,open,F:Ajpg",NULL,NULL,SW_SHOWNORMAL);break;翻开图片case,r':ShellExecute(NULLz"explore,',C:/windows/media,NULL,NULL,SW_SHOWNORM AL);break;default: pDIg-Am_lisJmsg.AddStTingd该字母对应操作尚未定义!");break;)4、设置控件背景透明HBRUSH CUDPprojectDlg:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtIColor)(HBRUSH hbr = CDialog:OnCtlColor(pDC, pWnd, nCtIColor);/ TODO: Change any attributes of the DC hereif(pWnd 今GetDlgCtrllD()=IDC_EDIT_OUTMSG)输入框背景(HBRUSH brush=CreateSolidBrush(RGB(255/255,255);return (HBRUSH)brush;)else if(nCtlColor = CTLCOLOR_STATIC) 对所有静态文本控件的设置(pDC->SetBkMode(TRANSPARENT); 设置背景为透明return (HBRUSH):GetStockObject(NULL_BRUSH);)elsereturn CDialog:OnCtlColor(pDC, pWnd, nCtIColor);/ TODO: Return a different brush if the default is not desiredreturn hbr;CRect rcStatic;this->GetDlgltem(IDC_STATIC_STATE)->GetWindowRect(&rcStatic);ScreenToClient(&rcStatic);lnvalidateRect(&rcStatic); 重新绘制this->GetDlgltem(IDC_EDIT_PORT)->EnableWindow(TRUE);this->SetDlgltemText(IDC_CONNECTJ 开始聊天)this->SetDlgltemText(IDC_STATIC_STATE,"请进行初始化设置 _“);this->GetDlgltem(IDC_EDIT_OUTMSG)->EnableWindow(FALSE);return;六 .实验总结25七 .思考题或讨论题25附录:局部代码(一)基于TCP/IP的计算机网络通信应用程序设计一 .实验目的和要求1 .通过本实验课程的学习,使学生能够理解TCP协议通信的基本原理。2 .通过运用WinSock接口编写网络通信应用程序,掌握TCP网络应用程序架构的 设计思想。3 .学会设计利用TCP简单的应用层协议。二 .实验原理TCP是面向连接的通信协议,TCP提供两台计算机之间的可靠无错的数据传输。应用程 序利用TCP进行通信时,源和目标之间会建立一个虚拟连接。这个连接一但建立,两台计算 机之间就可以把数据当作一个双向字节流进行交换。三 .实验方案与实验步骤1、 客户机/服务器工作流程服务器端1:创立套接字并将套接字绑定到一个本地地址和端口上(create) o2:将套接字设为监听模式,准备接受客户请求(listen) o3:等待客户请求到来;请求到来后,接受请求,返回一个新的对应于此次连接的套接字(accept) o4:用返回的套接字和客户端进行通信(send/receive) o5:返回,等待另一客户请求。6:关闭套接字。客户端1:创立套接字(create)。2:向服务器发出连接请求(connect)。3:和服务器进行通信(send/receive) o4:关闭套接字。图3.1客户机/服务器工作流程2、系统实现图3. 2系统实现过程四.实验设备与器材配置电脑、VC6.0五.实验记录1、界面(1)选择:客户机、服务器;(2)输入:IP设置、端口设置、输入内容;(3)输出显示:消息列表、发送和接收消息数目;(4)按钮:连接/侦听、发送、清空、退出。图5.1界面设计2、功能描述(1)初始化:服务器点击侦听,客户机输入服务器IP后,点击连接实现服务器一一客户 机之间的连接通信。在界面上显示连接信息,服务器向客户机发送Welcome my friend!, 客户机向服务器发送I am Paulo图5.2初始化(2)客户机与服务器对话:服务器显示Server: +发送的消息,客户机显示Paul: +发送 的信息。图5. 3客户机与服务器对话(3)输入/n在聊天对话框画一个牛,输入/p画一个 图5. 4输入/p画一个 图5. 5输入/n画一个 (4)输入/I会弹出一个对话框图5.6输入/I弹出一个对话框(5)输入/r会翻开一个windows资源管理器,并翻开指定的路径,当前设置的路径为:C:/windows/media图5.7输入/r翻开一个windows资源管理器3、改进(1)获取发送方主机名和发送时间通过函数gethostname (hostname, sizeof (hostname)得到主机名,客户机获得服务 器主机名为2013-20140524WQ,服务器获得客户机主机名为2013-20140524WQ (实验时使 用同一台电脑进行调试,所以主机名是一样的),添加到接收信息列表中信息前面。通过函数time。、loc函time。获得当前系统时间,能够显示发送接收时间,格式 为年/月/日时/分/秒,添加到接收信息列表中信息首部。图5.8获取主机名、添加发送时间(2)自定义字符画:定义字符串TP_xin_str,输入/x时调用绘制一个小象图5.9自定义字符画(3)自定义表情符号:输入/s时输出难过(丁一丁),输入/a时输出“生气(皿#),输入/j时输出惊讶等。图5.10自定义表情符号(4) 显示发送、接收消息总数通过mist.GetCount()函数实现对列表中发送和接收到的信息计数,并显示在界 面上。初始化时,发送数和接收数均为1,清空列表后,相应的重置为0。(5) 清空列表通过函数m list. ResetContent ()实现清空列表。(6) 添加背景图片、改变控件背景色、字体等。上传bmp图片到Bitmap资源文件夹中,在OnPaint ()中添加代码,通过不同图片的 ID来设置不同的背景图片。通过加入WM_CTLCOLOR消息,自动生成OnCtlColor ()函数,利用SetBkMode() > SetTextColor () > SetBkColor () > CreateSolidBrush () > SetFont ()等函数设置背景格式、 改变控件背景色和字体大小颜色等。图5. 10其他功能六.实验总结这次实验与实验二较为相似,在上次的基础上,增加了自定义字符画、符号表情等, 进一步加深了对TCP/IP协议的理解,也能够根据生活中的聊天工具如QQ等,增加一些类 似的功能,使其应用性更强。附录:(局部代码)1、获取对方主机信息添加发送接收时间(客户端和服务器类似,在此只贴出服 务器代码)void CProject2Dlg:OnServerReceive()(CString mDay;CString mTime;CString ttime;time_t tl;tl = time(NULL); 机器时间 struct tm *p;p = localtime(&tl); 转换为本地时间mDay.Format(,%4d/%2d/%2d',1900+p->tm_year,l+p->tm_mon,p->tm_mday);mTime.Format(,%3d:%2d:%2d,p->tm_houi;p->tm_min,p->tm_sec);BOOLAct=FALSE;CString nRev,nret,nRet;char bufMAX_BUFFER+l;int ret,i,len;char hostname100;ret=m_connectsocket.Receive(buf,MAX_BUFFER,0);if(ret!=SOCKET_ERROR) (gethostname(hostname,sizeof(hostname); 获取对方主机名 m_receive+=l;接收消息数加1bufret=NULL;nRev=buf;nRet+=mDay+mTime+” ''+1105101®+”;/添力口发送时间和主机名 nret+=CLIENT;nret+=":"len=nret.GetLength();nret=nRev.Right( (nRev.GetLength()-len );if(nret.GetAt(0)=7')(m_list_msg.AddString(nRet);Act=DoAction(nret);if(Act=FALSE)(nRet+=nRev;m_list_msg.AddString(nRet);)i=m_list_msg.GetCount();m_list_msg.SetCurSel(i-l);m_list_msg.SetCurSel(-l);UpdateData(FALSE);)else AfxMessageBox("消息接收错误!");)2、显示发送、接收消息总数void CProject2Dlg:OnSendMsg()(/ TODO: Add your control notification handler code here CString buf;int nret;BOOLAct=FALSE;int nLen,i;UpdateData(TRUE);m_outmsg.TrimLeft();if(m_outmsg.lsEmpty()(AfxMessageBox("对不起,不能发送空消息!"); return;)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)(m_send+二1;发送消息数加1if(m_outmsg.GetAt(0)=7') (Act=DoAction(m_outmsg);)jf(Act=FALSE)mJist_msg.AddString(LPCTSTR)buf); m_outmsg.Empty();i=m_list_msg.GetCount();mJist_msg.SetCurSel(i-l);m_list_msg.SetCurSel(-l);UpdateData(FALSE);)elseAfxMessageBox("消息发送失败!3、清空列表void CProject2Dlg:OnRemoveall()(/ TODO: Add your control notification handler code here m_list_msg.ResetContent();清空列表 m_receive=O;重置接收消息数m_send=0;重置发送消息数 UpdateData(FALSE);)4、自定义字符画void CProject2Dlg:DrawXin()(CString TP_xin_str7="/-( ),"/ _ _/,"/I ( 1(,"A/_ A I "," l_l I";int TP_xin_int=7;for(int i=O;i<TP_xinJnt;i+) (m_list_msg.AddString(TP_xin_stri);)5、自定义表情符号switch(act.GetAt(l)(case'm':ShellExecute(NULL,NULL,"老人与海.mp3","wmplayer.exe", NULL,SW_SHOWMAXIMIZED );return TRUE;case 'q'lAfxMessageBoxC'Quifreturn TRUE;case T:AfxMessageBox("开心(*八3八*)");return TRUE;case 's':AfxMessageBox("难过(丁一nr)");return TRUE;case 匕':AfxMessageBox("生气( JHL #)");return TRUE;case 'j':AfxMessageBox(“惊讶(Oo0)");return TRUE;case 'c'rAfxMessageBoxC'Circle OoOoOo");return TRUE; case 'rV/AfxMessageBoxC'Rectangle ");ShellExecute(NULL,explore"/"C:/windows/media, NULL,NULL,SW_SHOWNORMAL);return TRUE;case 'n':DrawNiu();return TRUE;case 'p'iDrawPhoneOjreturn TRUE;case 'x':DrawXin();return TRUE; default: return FALSE;)6、添加背景图片void CProject2Dlg:OnPaint()(if (lslconic()(CPaintDC dc(this); / device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); / Center icon in client rectangle int cxlcon = GetSystemMetrics(SM_CXICON);int cylcon = GetSystemMetrics(SM_CYICON); CRect rect;GetClientRect(&rect);int x = (rect.Width() - cxlcon + 1)/2;int y = (rect.Height() - cylcon + 1)/2;dc.Drawlcon(x, y, m_hlcon); / Draw the icon else (/CDialog:OnPaint(); CPaintDC dc(this); CRect rect;GetClientRect(&rect); CDC deMem;dcMem.CreateCompatibleDC(&dc);CBitmap bmpBackground;bmpBackground.LoadBitmap(IDB_BITMAPl);/IDB_BITMAP 是图对应的 ID BITMAP bitmap;bmpBackground.GetBitmap(&bitmap);CBitmap*pbmpOld=dcMem.SelectObject(&bmpBackground); dc.StretchBlt(O,O,rect.Width()/rect.Height(),&dcMem,O,O, bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);)7、改变背景色、字体大小颜色等HBRUSH CProject2Dlg:OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtIColor)(HBRUSH hbr = CDialog:OnCtlColor(pDCz pWnd, nCtIColor);/ TODO: Change any attributes of the DC here设置显示字体CFont * cFont=new CFont;cFont->CreateFont(16,0,0,0,FW_SEMIBOLD,FALSE,FALSE,0,ANSI_CHARSE1;OUT_DEFAULT_PRECI,CLIP_DEFAULT_PREC5DEFAULT_QUALSDEFAULT_PITCH&FF_SWISS, “Arial"); if(pWnd = this) 改变整个界面背景色 (HBRUSH brush=CreateSolidBrush(RGB(199,237,204);return (HBRUSH)brush;)switch(nCtlColor)(case CTLCOLOR_STATIC: 对所有静态文本控件的设置(pDC->SetBkMode(TRANSPARENT); 设置背景为透明 pDC->SetTextColor(RGB(255,255,0);设置字体颜色 pWnd->SetFont(cFont); 设置字体HBRUSH B = CreateSolidBrush(RGB(199,237,204); /仓ij建画刷return (HBRUSH) B; 返回画刷句柄)break;default:return CDialog:OnCtlColor(pDC,pWnd, nCtIColor);)/ TODO: Return a different brush if the default is not desiredreturn hbr;(二)基于UDP/IP的计算机网络通信应用程序设计、实验目的和要求.通过本实验课程的学习,使学生能够理解UDP协议通信的基本原理。1 .通过运用WinSock接口编写网络通信应用程序,掌握UDP网络应用程 序架构的设计思想。2 .学会设计利用UDP简单的应用层协议。