海亿美食网
您的当前位置:首页东北大学计算机网络实验报告

东北大学计算机网络实验报告

来源:海亿美食网


东北大学计算机网络实验报告

计算机网络实验报告

实验名称

学号姓名

日期成绩评阅人Tcp与Udp的通信实现软信11019杜海涛2013-7-13

软件学院

一、实验目的与意义

1、编写Tcp服务器与客户端程序,服务器程序在客户端连接后输出客户端信息(IP,端口号)

2、编写Tcp服务器与客户端程序,客户端在连接后可从键盘输入字符,在服务器端实时显

3、在2的基础上,服务器判断接收到的字符,如是某指定字符,则服务器退出监听

4、编写基于Udp的控制台聊天程序

通过tcp和udp的编程实现windows环境下的进程间的通信。

二、实验环境

操作系统:Windows7

实验环境:MicrosoftVisualC++6.0

三、实验的预习内容

传输控制协议TCP(TransportControlProtocol)是一种面向连接的,可靠的传输层协议。面向连接是指一次正常的TCP传输需要通过在TCP客户端和TCP服务端建立特定的虚电路连接来完成,该过程通常被称为“三次握手”。

举例说明,TCP客户端需要和TCP服务端建立连接,过程如图所示

第一步中,客户端向服务端提出连接请求。这时TCPSYN标志置位。客户端告诉服务端序列号区域合法,需要检查。客户端在TCP报头的序列号区中插入自己的ISN。

服务端收到该TCP分段后,在第二步以自己的ISN回应(SYN标志置位),同时确认收到客户端的第一个TCP分段(ACK标志置位)。

在第三步中,客户端确认收到服务端的ISN(ACK标志置位)。到此为止建立完整的TCP连接,开始全双工模式的数据传输过程。

UDP(UserDatagramProtocol),即用户数据报协议。它属于“面向无连接的

不可靠的传输”的类型。UDP中,每个数据包称为“数据报”,它的包头只包含4个域,主要是地址信息与包的长度和校验信息。与此对应,TCP包的头信息有10多个域。因此UDP的网络开销一般要小于TCP。

由于UDP在传送数据过程中没有建立连接,也不进行检查,因此UDP是不可靠的,它不能保证数据报能安全无误地到达目的主机。

四、实验的步骤与调试方法

程序的流程图

TCP协议

服务器客户端

UDP协议下实验:程序流程图:

UDP协议

服务器客户端

五、实验数据与实验结果

Tcpclient

Tcperver

Udpclient

Udpserver

六、实验用程序清单(要有注释)

TCPSERVER:

/ModuleName:tcpserver.cpp

include

include

pragmacomment(lib,"ws2_32.lib")

voidmain(void)

WSADATAwsaData;

SOCKETListeningSocket;

SOCKETNewConnection;

SOCKADDR_INServerAddr;

SOCKADDR_INClientAddr;

intClientAddrLen;

intPort=5150;

intRet;

charDataBuffer[1024];

/InitializeWinsockversion2.2

if((Ret=WSAStartup(MAKEWORD(2,2),wsaData))!=0)

printf("WSAStartupfailedwitherror%d ",Ret);

return;

/Createanewsockettolisteningforclientconnections.

if((ListeningSocket=socket(AF_INET,SOCK_STREAM,IPPROTO_TCP))==INVALID_SOCKET)

printf("socketfailedwitherror%d ",WSAGetLastError());WSACleanup();

return;

ServerAddr.sin_family=AF_INET;

ServerAddr.sin_port=htons(Port);

ServerAddr.sin_addr.s_addr=htonl(INADDR_ANY);

/Associatetheaddressinformationwiththesocketusingbind.

if(bind(ListeningSocket,(SOCKADDR)ServerAddr,sizeof(ServerAddr))==SOCKET_ERROR)

printf("bindfailedwitherror%d ",WSAGetLastError());

closesocket(ListeningSocket);

WSACleanup();

return;

/Listenforclientconnections.Weusedabacklogof5whichis

/normalformanyapplications.

if(listen(ListeningSocket,5)==SOCKET_ERROR)

printf("listenfailedwitherror%d ",WSAGetLastError());

closesocket(ListeningSocket);

WSACleanup();

return;

printf("等待客户端连接端口%d. ",Port);

/Acceptanewconnectionwhenonearrives.

ClientAddrLen=sizeof(ClientAddr);

if((NewConnection=accept(ListeningSocket,(SOCKADDR)ClientAddr,ClientAddrLen))==INVALID_SOCKET){

printf("acceptfailedwitherror%d ",WSAGetLastError());

closesocket(ListeningSocket);

WSACleanup();

return;

printf("成功建立连接%s ",

inet_ntoa(ClientAddr.sin_addr));

closesocket(ListeningSocket);

/StartsendingandreceivingdataonNewConnection.Forsimplicity,/wewilljustreceivesomedataandreporthowmanybyteswere

/received.

printf("等待接收数据... ");

printf("IPis%s ",inet_ntoa(ClientAddr.sin_addr));/打印ip地址

printf("portis%d ",htons(ClientAddr.sin_port));/打印端口号

While(flag)

if((Ret=recv(NewConnection,DataBuffer,sizeof(DataBuffer),0))/接收数据==SOCKET_ERROR)

printf("recvfailedwitherror%d ",WSAGetLastError());

closesocket(NewConnection);

WSACleanup();

return;

if(i=strcmp(buffer,"back")==0)/如果是指定字符断开连接

flag=0;

if(flag)

(DataBuffer+Ret)='