东南大学计算机网络第四次实验报告 - 图文
更新时间:2024-05-18 05:49:01 阅读量: 综合文库 文档下载
东南大学自动化学院
实 验 报 告
课程名称: 信息通信网络概论
第4次实验
实验名称: 实验四﹑计算机网络通信应用程序设计 院 (系): 自动化 专 业: 自动化 姓 名: 学 号: 实 验 室: 金智楼 实验组别: 同组人员: 实验时间: 2016 年 12 月 20 日 评定成绩: 审阅教师:
1
目 录
(一)基于TCP/IP的计算机网络通信应用程序设计
一.实验目的和要求 ····················································3 二.实验原理 ··························································3 三. 实验方案与实验步骤 ················································3 四.实验设备与器材配置 ················································4 五.实验记录 ··························································4 六.实验总结 ·························································11 附录:部分代码
(二)基于UDP/IP的计算机网络通信应用程序设计
一.实验目的和要求 ·················································· 17 二.实验原理 ························································ 17 三. 实验方案与实验步骤 ·············································· 17 四.实验设备与器材配置 ·············································· 18 五.实验记录 ························································ 18 六.实验总结 ························································ 25 七.思考题或讨论题 ·················································· 25 附录:部分代码
2
(一)基于TCP/IP的计算机网络通信应用程序设计
一. 实验目的和要求
1. 通过本实验课程的学习,使学生能够理解TCP协议通信的基本原理。 2.通过运用WinSock接口编写网络通信应用程序,掌握TCP网络应用程序架构的设计思想。
3.学会设计利用TCP简单的应用层协议。
二. 实验原理
TCP是面向连接的通信协议,TCP提供两台计算机之间的可靠无错的数据传输。应用程序利用TCP进行通信时,源和目标之间会建立一个虚拟连接。这个连接一但建立,两台计算机之间就可以把数据当作一个双向字节流进行交换。
三. 实验方案与实验步骤
1、 客户机/服务器工作流程
服务器端
1:创建套接字并将套接字绑定到一个本地地址和端口上(create)。 2:将套接字设为监听模式,准备接受客户请求(listen)。
3:等待客户请求到来;请求到来后,接受请求,返回一个新的对应于此次连接的套接字(accept)。
4:用返回的套接字和客户端进行通信(send/receive)。 5:返回,等待另一客户请求。 6:关闭套接字。 客户端
1:创建套接字(create)。
2:向服务器发出连接请求(connect)。 3:和服务器进行通信(send/receive)。 4:关闭套接字。
3
创建套接字Create()创建套接字Create()监听模式Listen()向服务器发出连接请求Connect()接受请求Accept()与客户端通信Send/Receive()与服务器通信Send/Receive()返回,等待另一客户请求关闭套接字关闭套接字(a)服务器工作流程(b)客户机工作流程
图3.1 客户机/服务器工作流程
2、 系统实现
利用MFCAppWizard生成程序框架增加控件对象从CAsyncSocket类继承终止连接发送和接收数据图3.2 系统实现过程
建立客户机与服务器之间的连接 四. 实验设备与器材配置
电脑、VC6.0
五. 实验记录
4
1、 界面
(1) 选择:客户机、服务器;
(2) 输入:IP设置、端口设置、输入内容; (3) 输出显示:消息列表、发送和接收消息数目; (4) 按钮:连接/侦听、发送、清空、退出。
图5.1 界面设计
2、 功能描述
(1)初始化:服务器点击侦听,客户机输入服务器IP后,点击连接实现服务器——客户机之间的连接通信。在界面上显示连接信息,服务器向客户机发送Welcome my friend!,客户机向服务器发送I am Paul。
5
图5.2 初始化
(2)客户机与服务器对话:服务器显示Server:+发送的消息 ,客户机显示Paul:+发送的信息。
图5.3客户机与服务器对话
6
(3)输入/n在聊天对话框画一个牛,输入/p画一个电话
图5.4 输入/p画一个电话
图5.5 输入/n画一个电话
(4)输入/l会弹出一个对话框
7
图5.6 输入/l弹出一个对话框
(5)输入/r会打开一个windows资源管理器,并打开指定的路径,当前设置的路径为:
C:/windows/media
图5.7 输入/r打开一个windows资源管理器
8
3、 改进
(1) 获取发送方主机名和发送时间
通过函数gethostname(hostname,sizeof(hostname))得到主机名,客户机获得服务器主机名为2013-20140524WQ,服务器获得客户机主机名为2013-20140524WQ(实验时使用同一台电脑进行调试,所以主机名是一样的),添加到接收信息列表中信息前面。
通过函数time()、localtime()获得当前系统时间,能够显示发送接收时间,格式为年/月/日 时/分/秒,添加到接收信息列表中信息首部。
图5.8 获取主机名、添加发送时间
(2) 自定义字符画:定义字符串TP_xin_str,输入/x时调用绘制一个小象
9
图5.9 自定义字符画
(3) 自定义表情符号:输入/s时输出\难过(╥﹏╥)\,输入/a时输出
\生气(▼皿▼#)\,输入/j时输出\惊讶(⊙o⊙)\等。
图5.10 自定义表情符号
10
(4) 显示发送、接收消息总数
通过m_list.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等,增加一些类似的功能,使其应用性更强。
11
附录:(部分代码)
1、获取对方主机信息添加发送接收时间(客户端和服务器类似,在此只贴出服务器代码)
void CProject2Dlg::OnServerReceive()
{
CString mDay; CString mTime; CString ttime; time_t t1;
t1 = time(NULL); //机器时间 struct tm *p;
p = localtime(&t1); //转换为本地时间
mDay.Format(\mTime.Format(\BOOL Act=FALSE;
CString nRev,nret,nRet; char buf[MAX_BUFFER+1]; int ret,i,len;
char hostname[100];
ret=m_connectsocket.Receive(buf,MAX_BUFFER,0); if(ret!=SOCKET_ERROR) {
gethostname(hostname,sizeof(hostname));//获取对方主机名 m_receive+=1;//接收消息数加1 buf[ret]=NULL; nRev=buf;
nRet+=mDay+mTime+\添加发送时间和主机名 nret+=CLIENT; nret+=\
len=nret.GetLength();
nret=nRev.Right( ( (nRev.GetLength())-len ) ); if(nret.GetAt(0)=='/') { m_list_msg.AddString(nRet); Act=DoAction(nret); }
if(Act==FALSE) { nRet+=nRev; m_list_msg.AddString(nRet); }
i=m_list_msg.GetCount();
12
m_list_msg.SetCurSel(i-1); m_list_msg.SetCurSel(-1); UpdateData(FALSE); } else
AfxMessageBox(\消息接收错误!\
}
2、 显示发送、接收消息总数
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(\对不起,不能发送空消息!\ 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;//发送消息数加1 if(m_outmsg.GetAt(0)=='/') { Act=DoAction(m_outmsg); }
if(Act==FALSE) {
13
m_list_msg.AddString((LPCTSTR)buf); }
m_outmsg.Empty();
i=m_list_msg.GetCount(); m_list_msg.SetCurSel(i-1); m_list_msg.SetCurSel(-1); UpdateData(FALSE); } else }
AfxMessageBox(\消息发送失败! :(\
3、 清空列表
void CProject2Dlg::OnRemoveall() {
// TODO: Add your control notification handler code here m_list_msg.ResetContent();//清空列表 m_receive=0;//重置接收消息数 m_send=0;//重置发送消息数 UpdateData(FALSE); }
4、 自定义字符画
void CProject2Dlg::DrawXin() {
CString TP_xin_str[7]= {
\ __ __ \ \ / \\\\~~~/ \\\\\ \ ,----( .. ) \ \ / \\\\__ __/ \ \ /| (\\\\ |( \ \ ^ \\\\ /___\\\\ /\\\\ | \ \ |__| |__|-“ \ };
int TP_xin_int=7;
for(int i=0;i 5、 自定义表情符号 switch(act.GetAt(1)) { case'm':ShellExecute(NULL,NULL,\老人与海.mp3\ 14 } NULL,SW_SHOWMAXIMIZED );return TRUE; case 'q':AfxMessageBox(\ case 'l':AfxMessageBox(\开心(*^ω^*)\ case 's':AfxMessageBox(\难过(╥﹏╥)\case 'a':AfxMessageBox(\生气(▼皿▼#)\case 'j':AfxMessageBox(\惊讶(⊙o⊙)\case 'c':AfxMessageBox(\case 'r'://AfxMessageBox(\ \ ShellExecute(NULL,\NULL,NULL,SW_SHOWNORMAL);return TRUE; case 'n':DrawNiu();return TRUE; case 'p':DrawPhone();return TRUE; case 'x':DrawXin();return TRUE; default: return FALSE; 6、 添加背景图片 void CProject2Dlg::OnPaint() { if (IsIconic()) { CPaintDC dc(this); // device context for painting SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0); // Center icon in client rectangle int cxIcon = GetSystemMetrics(SM_CXICON); int cyIcon = GetSystemMetrics(SM_CYICON); CRect rect; GetClientRect(&rect); int x = (rect.Width() - cxIcon + 1) / 2; int y = (rect.Height() - cyIcon + 1) / 2; dc.DrawIcon(x, y, m_hIcon); // Draw the icon } else { //CDialog::OnPaint(); CPaintDC dc(this); CRect rect; GetClientRect(&rect); CDC dcMem; dcMem.CreateCompatibleDC(&dc); CBitmap bmpBackground; bmpBackground.LoadBitmap(IDB_BITMAP1); //IDB_BITMAP是图对应的ID BITMAP bitmap; bmpBackground.GetBitmap(&bitmap); CBitmap*pbmpOld=dcMem.SelectObject(&bmpBackground); 15 没有校验,速度快,无须握手过程; tcp需要首先建立连接,而udp只要绑定端口发送就行,tcp如果建立连接以后,能够保证传送的数据包次序,而udp则不能保证数据包到达的先后次序,甚至会丢包;编程时,TCP面向连接的,即每次收发数据之前必须通过connect建立连接,也是双向的,即任何一方都可以收发数据,协议本身提供了一些保障机制保证它是可靠的、有序的,即每个包按照发送的顺序到达接收方。UDP它是无连接的,不可靠的,因为通讯双方发送数据后不知道对方是否已经收到数据,是否正常收到数据。任何一方建立一个socket以后就可以用sendto发送数据,也可以用recvfrom接收数据。根本不关心对方是否存在,是否发送了数据。它的特点是通讯速度比较快。 (2) 应采用TCP协议,TCP-有连接, 过程为可靠连接,不会丢失数据,能保证数据 正确传输。 (3) 网络中使用的IP电话服务采用的是UDP协议,IP电话是实时传输,必须使用 UDP。UDP 不保证可靠交付,但UCP 比TCP 的开销要小很多,IP电话接受这样的服务质量就可以使用UDP。 2、思考和调研目前常用的通信工具之一:QQ的基本实现方式。考虑其 各种不同的应用可能采取的是TCP和UDP中的哪种协议。如果需要对本实验结果进行进一步改进,有哪些想法。 26 附录:(部分代码) 1、 清空列表 void CUDPprojectDlg::OnDelete() { // TODO: Add your control notification handler code here m_list_msg.ResetContent();//清空列表 } 2、 导出消息记录 void CUDPprojectDlg::OnDownload() { // TODO: Add your control notification handler code here CString content; CString temp; for(int i=0;i FILE * fp; fp = fopen(\消息记录.txt\打开指定目录 fwrite(content, strlen(content), 1, fp);//写入字符串 fclose(fp); } 3、 自定义指定操作 void CUDPprojectDlg::DoAction(LPVOID lParam, char str) { CUDPprojectDlg *pDlg = (CUDPprojectDlg*)lParam; switch(str) { case 'n': pDlg->DrawNiu();break; case 'z': pDlg->DrawPig();break; case 'p': pDlg->DrawPhone();break; case'e':ShellExecute(NULL,\SW_SHOWNORMAL);break;//打开网址 case 't': ShellExecute(NULL,\4.jpg\ //打开图片 case'r':ShellExecute(NULL,\AL);break; default: pDlg->m_list_msg.AddString(\该字母对应操作尚未定义!\ } 27 } 4、 设置控件背景透明 HBRUSH CUDPprojectDlg::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor) { HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: Change any attributes of the DC here if((pWnd ->GetDlgCtrlID())==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); } else return CDialog::OnCtlColor(pDC, pWnd, nCtlColor); // TODO: Return a different brush if the default is not desired return hbr; } CRect rcStatic; this->GetDlgItem(IDC_STATIC_STATE)->GetWindowRect(&rcStatic); ScreenToClient(&rcStatic); InvalidateRect(&rcStatic);//重新绘制 this->GetDlgItem(IDC_EDIT_PORT)->EnableWindow(TRUE); this->SetDlgItemText(IDC_CONNECT,\开始聊天\ this->SetDlgItemText(IDC_STATIC_STATE,\ 请进行初始化设置@_@\ this->GetDlgItem(IDC_EDIT_OUTMSG)->EnableWindow(FALSE); return; 28
正在阅读:
我怎么那么拖拉作文400字06-19
公开课教案《主题二 微粒构成物质》08-19
一、勾山幼儿园交互式触控一体机采购清单03-03
各主流编程语言对比07-03
小学二年级体育全套的教案已整理(1)06-19
DSP原理与应用实验209-13
语文伴我成长作文(精选56篇)03-27
诊断技术行考作业306-05
学校争做四有好老师工作总结05-27
- 多层物业服务方案
- (审判实务)习惯法与少数民族地区民间纠纷解决问题(孙 潋)
- 人教版新课标六年级下册语文全册教案
- 词语打卡
- photoshop实习报告
- 钢结构设计原理综合测试2
- 2014年期末练习题
- 高中数学中的逆向思维解题方法探讨
- 名师原创 全国通用2014-2015学年高二寒假作业 政治(一)Word版
- 北航《建筑结构检测鉴定与加固》在线作业三
- XX县卫生监督所工程建设项目可行性研究报告
- 小学四年级观察作文经典评语
- 浅谈110KV变电站电气一次设计-程泉焱(1)
- 安全员考试题库
- 国家电网公司变电运维管理规定(试行)
- 义务教育课程标准稿征求意见提纲
- 教学秘书面试技巧
- 钢结构工程施工组织设计
- 水利工程概论论文
- 09届九年级数学第四次模拟试卷
- 东南大学
- 计算机网络
- 实验
- 图文
- 报告
- 新目标七年级上Unit3 Is this your pencil单元测试综合AB卷
- 二年级下册加减乘除混合运算应用题练习
- 纺织提花机市场现状调研及发展前景分析报告(目录)
- 课程设计(祁东煤矿)
- 西医内科学教学大纲(供参考)
- 2018房地产营销计划书
- 秦康毕业设计初稿
- 化学知识在生活中的应用
- 关于XX工程竣工结算超概算情况说明
- 化工原理卷子
- 【英语】2018年中考英语真题单选分类汇编:非谓语动词
- 安全规章管理制度模板
- 弥兴中学课例研修资料汇编(学校)123 - 图文
- 七年级历史学科工作总结
- 北师大版四年级语文下册导学案全册表格式
- 差旅费报销标准参考资料
- 浅谈古代诗歌的抒情手法
- 章生命可以永恒吗教学设计
- 人教版小学品德与社会三年级下册全册教案
- 苏教版必修三《五人墓碑记》说课稿