东南大学计算机网络第四次实验报告Word格式文档下载.docx
《东南大学计算机网络第四次实验报告Word格式文档下载.docx》由会员分享,可在线阅读,更多相关《东南大学计算机网络第四次实验报告Word格式文档下载.docx(16页珍藏版)》请在冰豆网上搜索。
3.学会设计利用TCP简单的应用层协议。
二.实验原理
TCP是面向连接的通信协议,TCP提供两台计算机之间的可靠无错的数据传输。
应用程序利用TCP进行通信时,源和目标之间会建立一个虚拟连接。
这个连接一但建立,两台计算机之间就可以把数据当作一个双向字节流进行交换。
三.实验方案与实验步骤
1、客户机/服务器工作流程
服务器端
1:
创建套接字并将套接字绑定到一个本地地址和端口上(create)。
2:
将套接字设为监听模式,准备接受客户请求(listen)。
3:
等待客户请求到来;
请求到来后,接受请求,返回一个新的对应于此次连接的套接字(accept)。
4:
用返回的套接字和客户端进行通信(send/receive)。
5:
返回,等待另一客户请求。
6:
关闭套接字。
客户端
创建套接字(create)。
向服务器发出连接请求(connect)。
和服务器进行通信(send/receive)。
图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;
i=m_list_msg.GetCount();
m_list_msg.SetCurSel(i-1);
m_list_msg.SetCurSel(-1);
UpdateData(FALSE);
}
else
AfxMessageBox("
消息接收错误!
);
}
2、显示发送、接收消息总数
OnSendMsg()
//TODO:
Addyourcontrolnotificationhandlercodehere
CStringbuf;
intnret;
intnLen,i;
UpdateData(TRUE);
m_outmsg.TrimLeft();
if(m_outmsg.IsEmpty())
对不起,不能发送空消息!
return;
if(m_server==TRUE)
buf+=SERVER;
buf+="
buf+=CLIENT;
buf+=m_outmsg;
nLen=buf.GetLength();
nret=m_connectsocket.Send((LPCTSTR)buf,nLen);
if(nret!
m_send+=1;
//发送消息数加1
if(m_outmsg.GetAt(0)=='
Act=DoAction(m_outmsg);
m_list_msg.AddString((LPCTSTR)buf);
m_outmsg.Empty();
消息发送失败!
:
("
3、清空列表
OnRemoveall()
m_list_msg.ResetContent();
//清空列表
m_receive=0;
//重置接收消息数
m_send=0;
//重置发送消息数
UpdateData(FALSE);
4、自定义字符画
DrawXin()
{
CStringTP_xin_str[7]=
{
____"
"
/\\~~~/\\"
----(..)"
/\\____/"
/|(\\|("
^\\/___\\/\\|"
|__||__|-“"
};
intTP_xin_int=7;
for(inti=0;
i<
TP_xin_int;
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"
l'
开心(*^ω^*)"
s'
a'
j'
c'
CircleOoOoOo"
r'
//AfxMessageBox("
Rectangle"
ShellExecute(NULL,"
explore"
/windows/media"
NULL,NULL,SW_SHOWNORMAL);
n'
DrawNiu();
p'
DrawPhone();
x'
DrawXin();
default:
returnFALSE;
6、添加背景图片
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
//CDialog:
OnPaint();
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);
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);
//设置背景为透明
SetTextColor(RGB(255,255,0));
//设置字体颜色
pWnd->
SetFont(cFont);
//设置字体
HBRUSHB=CreateSolidBrush(RGB(199,237,204));
//创建画刷
return(HBRUSH)B;
//返回画刷句柄
break;
returnCDialog:
OnCtlColor(pDC,pWnd,nCtlColor);
Returnadifferentbrushifthedefaultisnotdesired
returnhbr;
一、实验目的和要求
1.通过本实验课程的学习,使学生能够理解UDP协议通信的基本原理。
2.通过运用WinSock接口编写网络通信应用程序,掌握UDP网络应用程序架构的设计思想。
3.学会设计利用UDP简单的应用层协议。
二、实验原理
UDP是无连接通信协议,UDP不保证可靠数据的传输,但能够向若干个目标发送数据,接收发自若干个源的数据。
简单地说,如果一个主机向另外一台主机发送数据,这一数据就会立即发出,而不管另外一台主机是否已准备接收数据。
如果另外一台主机收到了数据,它不会确认收到与否。
三、实验方案与实验步骤
1.创建套接字并将套接字绑定到一个本地地址和端口上(create);
2.等待接收数据(ReceiveFrom);
3.关闭套接字。
1.创建套接字(create);
2.向服务器发送数据(sendto);
四、实验设备与器材配置
五、实验记录
(1)输入:
(2)输出显示:
消息列表;
(3)按钮:
发送、清空列表、导出消息记录、退出。
(1)初始化:
客户机输入服务器IP223.3.202.241后,点击开始聊天。
(a)客户端初始化
(b)服务器初始化
(2)客户机与服务器对话:
此时服务器并没有填写客户机的IP地址,能够接收到客户机发送的消息,并且获得发送方IP。
但是不能发送消息给客户机,只有填写客户机IP223.3.210.241后,才能发送消息给客户机。
(a)客户机端界面
(b)服务器端界面
图5.3客户机与服务器对话
图5.4字符画
(4)输入/r会打开一个windows资源管理器,并打开指定的路径,当前设置的路径为:
(1)添加发送时间
(2)清空列表
(3)导出消息记录
通过函数m_list_msg.GetText()把列表中的信息写入字符串中,再利用文件读写函数fopen()、fwrite()、fclose()将字符串写入指定文件中。
图5.8导出消息记录到txt中
(4)输入/e打开指定网址,输入/t打开指定图片
图5.9输入指定字符执行相应的操作
(5)添加背景图片、改变控件背景色、字体等。
方法与实验
(一)中相同,不再赘述。
六、实验总结
在原有程序的基础上,增加了保存消息记录、自定义协议等功能,同时修改了界面,但是对于MFC中按钮的界面设置仍然不太了解,尝试直接在WM_CTLCOLOR消息自动生成OnCtlColor()函数中进行设置,没有达到预期效果,希望在以后的学习过程中能够学到并解决这个问题。
通过这次实验,我对TCP协议和UDP协议各自的特点有了一定理解,能够判断在不同场合下应使用哪个协议,掌握并理解了它们的区别和各自的优缺点。
七、思考题或讨论题
1、结合所学知识与实验中的感受,说明TCP协议和UDP协议各自的优缺点。
在工业控制的现场中,要通过网络控制一台焊接机器人的运行,要求控制数据能正确传输。
试分析说明,采用哪种运输层协议比较好?
另外,网络中使用的IP电话服务采用的是哪种运输层协议?
为什么要采用这种协议?
并说明理由。
(1)TCP协议和UDP协议各自的优缺点:
TCP-有连接,所以握手过程会消耗资源,过程为可靠连接,不会丢失数据,适合大数据量交换;
UDP-非可靠连接,会丢包,没有校验,速度快,无须握手过程;