计算机网络实验4.docx
《计算机网络实验4.docx》由会员分享,可在线阅读,更多相关《计算机网络实验4.docx(27页珍藏版)》请在冰豆网上搜索。
计算机网络实验4
东南大学自动化学院
实验报告
课程名称:
计算机网络实验
实验名称:
实验四 TCP/UDP
院(系):
自动化专业:
自动化
姓名:
杨淳元学号:
08012131
实验室:
机房实验组别:
同组人员:
实验时间:
2014年12月8日
评定成绩:
审阅教师:
一、 实验目的和要求:
(一)基于TCP/IP的计算机网络通信应用程序设计
1. 通过本实验课程的学习,使学生能够理解TCP协议通信的基本原理。
2.通过运用WinSock接口编写网络通信应用程序,掌握TCP网络应用程序架构的设计思想。
3.学会设计利用TCP简单的应用层协议。
(二)基于UDP/IP的计算机网络通信应用程序设计
1. 通过本实验课程的学习,使学生能够理解UDP协议通信的基本原理。
2.通过运用WinSock接口编写网络通信应用程序,掌握UDP网络应用程序架构的设计思想。
3.学会设计利用UDP简单的应用层协议。
二、实验原理:
TCP(Transmission Control Protocol,传输控制协议)是基于连接的协议,也就是说,在正式收发数据前,必须和对方建立可靠的连接。
一个TCP连接必须要经过三次“对话”才能建立起来,其中的过程非常复杂,我们这里只做简单、形象的介绍,你只要做到能够理解这个过程即可。
我们来看看这三次对话的简单过程:
主机A向主机B发出连接请求数据包:
“我想给你发数据,可以吗?
”,这是第一次对话;主机B向主机A发送同意连接和要求同步(同步就是两台主机一个在发送,一个在接收,协调工作)的数据包:
“可以,你什么时候发?
”,这是第二次对话;主机A再发出一个数据包确认主机B的要求同步:
“我现在就发,你接着吧!
”,这是第三次对话。
三次“对话”的目的是使数据包的发送和接收同步,经过三次“对话”之后,主机A才向主机B正式发送数据。
TCP协议能为应用程序提供可靠的通信连接,使一台计算机发出的字节流无差错地发往网络上的其他计算机,对可靠性要求高的数据通信系统往往使用TCP协议传输数据。
UDP(User Data Protocol,用户数据报协议)是与TCP相对应的协议。
它是面向非连接的协议,它不与对方建立连接,而是直接就把数据包发送过去!
UDP适用于一次只传送少量数据、对可靠性要求不高的应用环境。
比如,我们经常使用“ping”命令来测试两台主机之间TCP/IP通信是否正常,其实“ping”命令的原理就是向对方主机发送UDP数据包,然后对方主机确认收到数据包,如果数据包是否到达的消息及时反馈回来,那么网络就是通的。
例如,在默认状态下,一次“ping”操作发送4个数据包(如图2所示)。
大家可以看到,发送的数据包数量是4包,收到的也是4包(因为对方主机收到后会发回一个确认收到的数据包)。
这充分说明了UDP协议是面向非连接的协议,没有建立连接的过程。
正因为UDP协议没有连接的过程,所以它的通信效果高;但也正因为如此,它的可靠性不如TCP协议高。
QQ就使用UDP发消息,因此有时会出现收不到消息的情况。
TCP协议和UDP协议各有所长、各有所短,适用于不同要求的通信环境。
TCP协议和UDP协议之间的差别如附表所示。
三、实验方案与实验步骤:
基于TCP的SOCKET编程:
服务器端
1:
创建套接字(create)
2:
将套接字设为监听模式,准备接受客户请 求(listen)
3:
等待客户请求到来;请求到来后,接受请求,返回一个新的对应于此次连接的套接字(accept)
4:
用返回的套接字和客户端进行通信(send/recv)
5:
关闭套接字
客户端
1:
创建套接字(socket)
2:
向服务器发出连接请求(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网络硬软件环境;
2.微机 1台。
五、实验记录:
TCP:
voidCProject2Dlg:
:
OnSelchangeComboCs()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
intset=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,"连接");
this->SetWindowText("TCP/IP通信-客户端");
}
elseif(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通信-服务器端");
}
}
voidCProject2Dlg:
:
OnConnect()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
intretb,ret,retc;
SOCKADDR_INaddr;
BOOLnret;
CStringServerIP;
ServerIP=m_set_ip;
if(m_active==TRUE)
return;
if(m_server==TRUE)
{
if(((m_set_port)<=1024)||((m_set_port)>4096))
{
AfxMessageBox("请输入合理的端口号!
");
}
ret=m_listensocket.Create(m_set_port,SOCK_STREAM);
if(ret==false)
{
m_static_state="无法建立服务器!
";
UpdateData(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)->EnableWindow(FALSE);
UpdateData(FALSE);
m_active=TRUE;
}
else
{
ServerIP.TrimLeft();
ServerIP.TrimRight();
if(inet_addr(ServerIP)==INADDR_NONE)
{
AfxMessageBox("请输入正确的服务器IP地址!
");
}
if(((m_set_port)<=1024)||((m_set_port)>4096))
{
AfxMessageBox("请输入合理的端口号!
");
}
retc=m_connectsocket.Create(0,SOCK_STREAM);
if(retc==false)
{
m_static_state="无法建立客户端!
";
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_state="正在连接服务器……";
this->GetDlgItem(IDC_CONNECT)->EnableWindow(FALSE);
this->GetDlgItem(IDC_COMBO_CS)->EnableWindow(FALSE);
UpdateData(FALSE);
m_active=TRUE;
}
}
}
voidCProject2Dlg:
:
OnServerAccept()
{
if(m_active==TRUE)
{
m_listensocket.Accept(m_connectsocket,NULL,NULL);
m_static_state="客户端已连接上——";
m_list_msg.AddString("====>客户端连接成功!
");
UpdateData(FALSE);
CStringwelcome("Welcomemyfriend!
");
m_connectsocket.Send(welcome,welcome.GetLength());
}
}
voidCProject2Dlg:
:
OnClientConnect(intnErrorCode)
{
sockaddr_inname;
intlen;
CStringbuf;
if(m_active==TRUE)
{
if(nErrorCode!
=0)
{
m_list_msg.AddString("连接服务器错误!
");
m_static_state="服务器连接错误……";
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(name.sin_addr);
m_list_msg.AddString(buf);
m_static_state="服务器连接成功!
";
UpdateData(FALSE);
CStringwelcome("Iam");
welcome+=CLIENT;
m_connectsocket.Send(welcome,welcome.GetLength());
}
}
}
voidCProject2Dlg:
:
OnServerClose()
{
m_connectsocket.Close();
m_static_state="正在侦听……";
m_list_msg.ResetContent();
m_list_msg.AddString("====>客户端已退出……");
m_list_msg.AddString("====>服务器正在侦听……");
UpdateData(FALSE);
}
voidCProject2Dlg:
:
OnSocketClose()
{
if(m_active==FALSE)
return;
if(m_server==TRUE)
{
OnServerClose();
}
else
{
OnClientClose();
}
}
voidCProject2Dlg:
:
OnClientClose()
{
m_connectsocket.Close();
m_list_msg.ResetContent();
m_list_msg.AddString("服务器已断开。
成功退出……");
m_static_state="已断开连接……";
this->GetDlgItem(IDC_CONNECT)->EnableWindow(TRUE);
this->GetDlgItem(IDC_COMBO_CS)->EnableWindow(TRUE);
UpdateData(FALSE);
m_active=FALSE;
}
voidCProject2Dlg:
:
OnSocketReceive()
{
if(m_server==TRUE)
{
OnServerReceive();
}
else
{
OnClientReceive();
}
}
voidCProject2Dlg:
:
OnServerReceive()
{
BOOLAct=FALSE;
CStringnRev,nret;
charbuf[MAX_BUFFER+1];
intret,i,len;
ret=m_connectsocket.Receive(buf,MAX_BUFFER,0);
if(ret!
=SOCKET_ERROR)
{
buf[ret]=NULL;
nRev=buf;
nret+=CLIENT;
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_list_msg.SetCurSel(-1);
UpdateData(FALSE);
}
else
AfxMessageBox("消息接收错误!
");
}
voidCProject2Dlg:
:
OnClientReceive()
{
charbuf[MAX_BUFFER+1];
BOOLAct=FALSE;
intret,i,len;
CStringnRev,nret;
ret=m_connectsocket.Receive(buf,MAX_BUFFER,0);
if(ret!
=SOCKET_ERROR)
{
buf[ret]=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_list_msg.SetCurSel(-1);
UpdateData(FALSE);
}
else
AfxMessageBox("消息接收错误!
");
}
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)
{
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("消息发送失败!
:
(");
}
BOOLCProject2Dlg:
:
DoAction(CStringact)
{
/*CPaintDCdc(this);
CRectrect;
GetClientRect(&rect);
rect.DeflateRect(50,50);
CDC*pDC=GetDC();
CPenpen(PS_SOLID,3,RGB(255,0,0));
pDC->SelectObject(&pen);
pDC->Rectangle(10,10,10,10);*/
switch(act.GetAt
(1))
{
case'm':
ShellExecute(NULL,NULL,"老人与海.mp3","wmplayer.exe",NULL,SW_SHOWMAXIMIZED);
returnTRUE;
case'q':
AfxMessageBox("Quit");returnTRUE;
case'l':
AfxMessageBox("Laugh*_*:
-)");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;
default:
returnFALSE;
}
}
voidCProject2Dlg:
:
DrawNiu()
{
for(inti=0;i{
m_list_msg.AddString(TP_niu_str[i]);
}
}
voidCProject2Dlg:
:
DrawPhone()
{
for(inti=0;i{
m_list_msg.AddString(TP_phone_str[i]);
}
}
UDP:
voidCUDPprojectDlg:
:
OnConnect()
{
//TODO:
Addyourcontrolnotificationhandlercodehere
UpdateData(TRUE);
CStringstrconnect;
m_connect.GetWindowText(strconnect);
if(strconnect=="开始聊天")
{
BOOLnret;
HANDLEThread;
SOCKADDR_INaddr;
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,