计算机网络实验4.docx

上传人:b****7 文档编号:10601303 上传时间:2023-02-21 格式:DOCX 页数:27 大小:120.07KB
下载 相关 举报
计算机网络实验4.docx_第1页
第1页 / 共27页
计算机网络实验4.docx_第2页
第2页 / 共27页
计算机网络实验4.docx_第3页
第3页 / 共27页
计算机网络实验4.docx_第4页
第4页 / 共27页
计算机网络实验4.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

计算机网络实验4.docx

《计算机网络实验4.docx》由会员分享,可在线阅读,更多相关《计算机网络实验4.docx(27页珍藏版)》请在冰豆网上搜索。

计算机网络实验4.docx

计算机网络实验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,

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

当前位置:首页 > 教学研究 > 教学反思汇报

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

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