东南大学计算机网络第四次实验报告.docx

上传人:b****6 文档编号:7489060 上传时间:2023-01-24 格式:DOCX 页数:16 大小:23.55KB
下载 相关 举报
东南大学计算机网络第四次实验报告.docx_第1页
第1页 / 共16页
东南大学计算机网络第四次实验报告.docx_第2页
第2页 / 共16页
东南大学计算机网络第四次实验报告.docx_第3页
第3页 / 共16页
东南大学计算机网络第四次实验报告.docx_第4页
第4页 / 共16页
东南大学计算机网络第四次实验报告.docx_第5页
第5页 / 共16页
点击查看更多>>
下载资源
资源描述

东南大学计算机网络第四次实验报告.docx

《东南大学计算机网络第四次实验报告.docx》由会员分享,可在线阅读,更多相关《东南大学计算机网络第四次实验报告.docx(16页珍藏版)》请在冰豆网上搜索。

东南大学计算机网络第四次实验报告.docx

东南大学计算机网络第四次实验报告

东南大学自动化学院

实验报告

课程名称:

信息通信网络概论

第4次实验

实验名称:

实验四﹑计算机网络通信应用程序设计

院(系):

自动化专业:

自动化

姓名:

学号:

实验室:

金智楼实验组别:

同组人员:

实验时间:

2016年12月20日

评定成绩:

审阅教师:

(一)基于TCP/IP的计算机网络通信应用程序设计

一.实验目的和要求····················································3

二.实验原理··························································3

三.实验方案与实验步骤················································3

四.实验设备与器材配置················································4

五.实验记录··························································4

六.实验总结·························································11

附录:

部分代码

(二)基于UDP/IP的计算机网络通信应用程序设计

一.实验目的和要求··················································17

二.实验原理························································17

三.实验方案与实验步骤··············································17

四.实验设备与器材配置··············································18

五.实验记录························································18

六.实验总结························································25

七.思考题或讨论题··················································25

附录:

部分代码

(一)基于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.1客户机/服务器工作流程

2、系统实现

图3.2系统实现过程

四.实验设备与器材配置

电脑、VC6.0

五.实验记录

1、界面

(1)选择:

客户机、服务器;

(2)输入:

IP设置、端口设置、输入内容;

(3)输出显示:

消息列表、发送和接收消息数目;

(4)按钮:

连接/侦听、发送、清空、退出。

图5.1界面设计

2、功能描述

(1)初始化:

服务器点击侦听,客户机输入服务器IP后,点击连接实现服务器——客户机之间的连接通信。

在界面上显示连接信息,服务器向客户机发送Welcomemyfriend!

,客户机向服务器发送IamPaul。

图5.2初始化

(2)客户机与服务器对话:

服务器显示Server:

+发送的消息,客户机显示Paul:

+发送的信息。

图5.3客户机与服务器对话

(3)输入/n在聊天对话框画一个牛,输入/p画一个电话

图5.4输入/p画一个电话

图5.5输入/n画一个电话

(4)输入/l会弹出一个对话框

图5.6输入/l弹出一个对话框

(5)输入/r会打开一个windows资源管理器,并打开指定的路径,当前设置的路径为:

C:

/windows/media

图5.7输入/r打开一个windows资源管理器

3、改进

(1)获取发送方主机名和发送时间

通过函数gethostname(hostname,sizeof(hostname))得到主机名,客户机获得服务器主机名为2013-20140524WQ,服务器获得客户机主机名为2013-20140524WQ(实验时使用同一台电脑进行调试,所以主机名是一样的),添加到接收信息列表中信息前面。

通过函数time()、localtime()获得当前系统时间,能够显示发送接收时间,格式为年/月/日时/分/秒,添加到接收信息列表中信息首部。

图5.8获取主机名、添加发送时间

(2)自定义字符画:

定义字符串TP_xin_str,输入/x时调用绘制一个小象

图5.9自定义字符画

(3)自定义表情符号:

输入/s时输出"难过(╥﹏╥)",输入/a时输出

"生气(▼皿▼#)",输入/j时输出"惊讶(⊙o⊙)"等。

图5.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等,增加一些类似的功能,使其应用性更强。

附录:

(部分代码)

1、获取对方主机信息添加发送接收时间(客户端和服务器类似,在此只贴出服务器代码)

voidCProject2Dlg:

:

OnServerReceive()

{

CStringmDay;

CStringmTime;

CStringttime;

time_tt1;

t1=time(NULL);//机器时间

structtm*p;

p=localtime(&t1);//转换为本地时间

mDay.Format("%4d/%2d/%2d",1900+p->tm_year,1+p->tm_mon,p->tm_mday);

mTime.Format("%3d:

%2d:

%2d",p->tm_hour,p->tm_min,p->tm_sec);

BOOLAct=FALSE;

CStringnRev,nret,nRet;

charbuf[MAX_BUFFER+1];

intret,i,len;

charhostname[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+""+hostname+"";//添加发送时间和主机名

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();

m_list_msg.SetCurSel(i-1);

m_list_msg.SetCurSel(-1);

UpdateData(FALSE);

}

else

AfxMessageBox("消息接收错误!

");

}

2、显示发送、接收消息总数

voidCProject2Dlg:

:

OnSendMsg()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

CStringbuf;

intnret;

BOOLAct=FALSE;

intnLen,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)

{

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、清空列表

voidCProject2Dlg:

:

OnRemoveall()

{

//TODO:

Addyourcontrolnotificationhandlercodehere

m_list_msg.ResetContent();//清空列表

m_receive=0;//重置接收消息数

m_send=0;//重置发送消息数

UpdateData(FALSE);

}

4、自定义字符画

voidCProject2Dlg:

:

DrawXin()

{

CStringTP_xin_str[7]=

{

"____",

"/\\~~~/\\",

",----(..)",

"/\\____/",

"/|(\\|(",

"^\\/___\\/\\|",

"|__||__|-“"

};

intTP_xin_int=7;

for(inti=0;i

{

m_list_msg.AddString(TP_xin_str[i]);

}

}

5、自定义表情符号

switch(act.GetAt

(1))

{

case'm':

ShellExecute(NULL,NULL,"老人与海.mp3","wmplayer.exe",NULL,SW_SHOWMAXIMIZED);returnTRUE;

case'q':

AfxMessageBox("Quit");returnTRUE;

case'l':

AfxMessageBox("开心(*^ω^*)");returnTRUE;

case's':

AfxMessageBox("难过(╥﹏╥)");returnTRUE;

case'a':

AfxMessageBox("生气(▼皿▼#)");returnTRUE;

case'j':

AfxMessageBox("惊讶(⊙o⊙)");returnTRUE;

case'c':

AfxMessageBox("CircleOoOoOo");returnTRUE;

case'r':

//AfxMessageBox("Rectangle");

ShellExecute(NULL,"explore","C:

/windows/media",

NULL,NULL,SW_SHOWNORMAL);returnTRUE;

case'n':

DrawNiu();returnTRUE;

case'p':

DrawPhone();returnTRUE;

case'x':

DrawXin();returnTRUE;

default:

returnFALSE;

}

6、添加背景图片

voidCProject2Dlg:

:

OnPaint()

{

if(IsIconic())

{

CPaintDCdc(this);//devicecontextforpainting

SendMessage(WM_ICONERASEBKGND,(WPARAM)dc.GetSafeHdc(),0);

//Centericoninclientrectangle

intcxIcon=GetSystemMetrics(SM_CXICON);

intcyIcon=GetSystemMetrics(SM_CYICON);

CRectrect;

GetClientRect(&rect);

intx=(rect.Width()-cxIcon+1)/2;

inty=(rect.Height()-cyIcon+1)/2;

dc.DrawIcon(x,y,m_hIcon);//Drawtheicon

}

else

{

//CDialog:

:

OnPaint();

CPaintDCdc(this);

CRectrect;

GetClientRect(&rect);

CDCdcMem;

dcMem.CreateCompatibleDC(&dc);

CBitmapbmpBackground;

bmpBackground.LoadBitmap(IDB_BITMAP1);//IDB_BITMAP是图对应的ID

BITMAPbitmap;

bmpBackground.GetBitmap(&bitmap);

CBitmap*pbmpOld=dcMem.SelectObject(&bmpBackground);dc.StretchBlt(0,0,rect.Width(),rect.Height(),&dcMem,0,0,

bitmap.bmWidth,bitmap.bmHeight,SRCCOPY);

}

}

7、改变背景色、字体大小颜色等

HBRUSHCProject2Dlg:

:

OnCtlColor(CDC*pDC,CWnd*pWnd,UINTnCtlColor)

{

HBRUSHhbr=CDialog:

:

OnCtlColor(pDC,pWnd,nCtlColor);

//TODO:

ChangeanyattributesoftheDChere

//设置显示字体

CFont*cFont=newCFont;

cFont->CreateFont(16,0,0,0,FW_SEMIBOLD,FALSE,FALSE,0,ANSI_CHARSET,OUT_DEFAULT_PRECIS,CLIP_DEFAULT_PRECIS,DEFAULT_QUALITY,DEFAULT_PITCH&FF_SWISS,"Arial");

if(pWnd==this)//改变整个界面背景色

{

HBRUSHbrush=CreateSolidBrush(RGB(199,237,204));

return(HBRUSH)brush;

}

switch(nCtlColor)

{

caseCTLCOLOR_STATIC:

//对所有静态文本控件的设置

{

pDC->SetBkMode(TRANSPARENT);//设置背景为透明

pDC->SetTextColor(RGB(255,255,0));//设置字体颜色

pWnd->SetFont(cFont);//设置字体

HBRUSHB=CreateSolidBrush(RGB(199,237,204));//创建画刷

return(HBRUSH)B;//返回画刷句柄

}

break;

default:

returnCDialog:

:

OnCtlColor(pDC,pWnd,nCtlColor);

}

//TODO:

Returnadifferentbrushifthedefaultisnotdesired

returnhbr;

}

(二)基于UDP/IP的计算机网络通信应用程序设计

一、实验目的和要求

1.通过本实验课程的学习,使学生能够理解UDP协议通信的基本原理。

2.通过运用WinSock接口编写网络通信应用程序,掌握UDP网络应用程序架构的设计思想。

3.学会设计利用UDP简单的应用层协议。

二、实验原理

UDP是无连接通信协议,UDP不保证可靠数据的传输,但能够向若干个目标发送数据,接收发自若干个源的数据。

简单地说,如果一个主机向另外一台主机发送数据,这一数据就会立即发出,而不管另外一台主机是否已准备接收数据。

如果另外一台主机收到了数据,它不会确认收到与否。

三、实验方案与实验步骤

服务器端

1.创建套接字并将套接字绑定到一个本地地址和端口上(create);

2.等待接收数据(ReceiveFrom);

3.关闭套接字。

客户端

1.创建套接字(create);

2.向服务器发送数据(sendto);

3.关闭套接字。

四、实验设备与器材配置

电脑、VC6.0

五、实验记录

1、界面

(1)输入:

IP设置、端口设置、输入内容;

(2)输出显示:

消息列表;

(3)按钮:

发送、清空列表、导出消息记录、退出。

图5.1界面设计

2、功能描述

(1)初始化:

客户机输入服务器IP223.3.202.241后,点击开始聊天。

(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()、localtime()获得当前系统时间,能够显示发送接收时间,格式为年/月/日时/分/秒,添加到接收信息列表中信息首部。

(2)清空列表

通过函数m_list.ResetContent()实现清空列表。

(3)导出消息记录

通过函数m_list_msg.GetText()把列表中的信息写入字符串中,再利用文件读写函数fopen()、fwrite()、fclose()将字符串写入指定文件中。

图5.8导出消息记录到txt中

(4)输入/e打开指定网址,输入/t打开指定图片

图5.9输入指定字符执行相应的操作

(5)添加背景图片、改变控件背景色、字体等。

方法与实验

(一)中相同,不再赘述。

图5.10其他功能

六、实验总结

在原有程序的基础上,增加了保存消息记录、自定义协议等功能,同时修改了界面,但是对于MFC中按钮的界面设置仍然不太了解,尝试直接在WM_CTLCOLOR消息自动生成OnCtlColor()函数中进行设置,没有达到预期效果,希望在以后的学习过程中能够学到并解决这个问题。

通过这次实验,我对TCP协议和UDP协议各自的特点有了一定理解,能够判断在不同场合下应使用哪个协议,掌握并理解了它们的区别和各自的优缺点。

七、思考题或讨论题

1、结合所学知识与实验中的感受,说明TCP协议和UDP协议各自的优缺点。

在工业控制的现场中,要通过网络控制一台焊接机器人的运行,要求控制数据能正确传输。

试分析说明,采用哪种运输层协议比较好?

另外,网络中使用的IP电话服务采用的是哪种运输层协议?

为什么要采用这种协议?

并说明理由。

(1)TCP协议和UDP协议各自的优缺点:

TCP-有连接,所以握手过程会消耗资源,过程为可靠连接,不会丢失数据,适合大数据量交换;UDP-非可靠连接,会丢包,没有校验,速度快,无须握手过程;

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 小学教育 > 语文

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1