当前位置:文档之家› UDP及TCP通信程序的设计与实现实验报告

UDP及TCP通信程序的设计与实现实验报告

实验报告课程计算机网络(双语)(课程设计)实验名称UDP及TCP通信程序的设计与实现专业班级姓名学号2013年 5 月30日目录实验目的和内容ﻩ错误!未定义书签。

实验目的ﻩ错误!未定义书签。

实验内容ﻩ错误!未定义书签。

实验环境ﻩ错误!未定义书签。

程序的逻辑框图ﻩ错误!未定义书签。

UDP通信程序的逻辑框图:ﻩ错误!未定义书签。

TCP通信程序的逻辑框图:ﻩ错误!未定义书签。

程序源代码(数据结构的描述、核心算法)ﻩ错误!未定义书签。

1.TCP通信程序源代码............................................. 错误!未定义书签。

2.TCP通信程序数据结构的描述ﻩ73.TCP通信程序的核心算法ﻩ错误!未定义书签。

4.UDP通信程序源代码.................................................. 错误!未定义书签。

5.UDP通信程序数据结构的描述.................................. 错误!未定义书签。

6.UDP通信程序的核心算法.......................................... 错误!未定义书签。

实验数据、结果分析.................................................................... 错误!未定义书签。

TCP通信程序实验结果分析ﻩ错误!未定义书签。

UDP通信程序实验结果分析......................................... 错误!未定义书签。

总结................................................................................................ 错误!未定义书签。

实验目的和内容实验目的掌握win32平台下,使用winsock API来实现UDP通信程序和TCP通信程序。

实验内容1.实现控制台模式下,在单机上基于UDP的聊天程序;2.实现控制台模式下,在单机上基于TCP的聊天程序;3.上述两个程序,最简单的实现方式是:一方发送、另一方接收、交替进行;4.提交上述2个程序的源程序,程序代码有充分的注释,并填写实验报告,实验报告的主要内容为说明程序设计的思路,程序代码的流程。

实验环境在win7系统下,visual studio2008环境下的win32平台下程序的逻辑框图UDP通信程序的逻辑框图:Server端:Client端:TCP通信程序的逻辑框图:Server端:程序源代码(数据结构的描述、核心算法)1.TCP通信程序源代码Client端:#include"stdafx.h"#include<stdlib.h>#include<stdio.h>#include<string.h>#include<winsock.h>//初始化函数,初始化版本号int InitSock(BYTE minorVer =2, BYTE majorVer= 2){ﻩWSADATA wsaData;WORD sockVersion = MAKEWORD(minorVer,majorVer);if(WSAStartup(sockVersion,&wsaData) !=0)exit(0);ﻩreturn 1;}int main(){char rbuf[256];ﻩchar szText[256];ﻩInitSock();//创建socket,第一个参数表示用IP协议,第二个参数表示用TCP传输,第三个不大清楚ﻩSOCKETsListen = socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);ﻩﻩ//判断socket是否创建成功if(sListen == INVALID_SOCKET)ﻩ{ﻩprintf("Failedsocket()\n");ﻩﻩreturn 0;ﻩ}ﻩ//用于存储IP地址和端口号的变量sockaddr_in sin;sin.sin_family= AF_INET; //IP协议sin.sin_port=htons(4567);ﻩ//端口号sin.sin_addr.S_un.S_addr = INADDR_ANY;//接收任何IP的连接//绑定函数,将socket与IP地址和端口绑定在一块if(bind(sListen,(LPSOCKADDR)&sin, sizeof(sin))==SOCKET_ERROR){ﻩﻩprintf("Failed bind()\n");ﻩreturn0;ﻩ}//开始监听,第二个参数表示最大连接数if(listen(sListen,2)== SOCKET_ERROR){printf("Failedlisten() \n");ﻩﻩreturn0;ﻩ}ﻩ//定义一个新的变量sockaddr_inremoteAddr;int nAddrLen= sizeof(remoteAddr);ﻩ//用于存储连接客户端的socketSOCKET sClient;//accept函数会阻塞,直到等到有socket连接服务器为止,才继续往后执行,并将客户端的IP和端口号存在remoteAddr中ﻩsClient =accept(sListen,(SOCKADDR*)&remoteAddr,&nAddrLen);printf("接收到一个连接%s \r\n", inet_ntoa(remoteAddr.sin_addr));ﻩwhile(TRUE)ﻩ{ﻩﻩif(sClient ==INVALID_SOCKET)ﻩ{ﻩﻩprintf("Failed accept()");ﻩﻩcontinue;}ﻩﻩprintf("send:");ﻩscanf("%s",szText);ﻩﻩ//发送函数,往sClient这个socket中发送szTextsend(sClient, szText,strlen(szText), 0);//recv为阻塞函数,等待sClient中传来数据int nRecv = recv(sClient, rbuf, 256, 0);ﻩif(nRecv>0)ﻩ{ﻩrbuf[nRecv]='\0';ﻩﻩﻩprintf("receive:%s\n", rbuf);}}closesocket(sClient);ﻩclosesocket(sListen);ﻩWSACleanup();return 0;}Server端:#include"stdafx.h"#include<stdlib.h>#include<stdio.h>#include<string.h>#include<winsock.h>//初始化函数,初始化版本号int InitSock(BYTEminorVer =2,BYTEmajorVer =2){ﻩWSADATA wsaData;ﻩWORDsockVersion= MAKEWORD(minorVer, majorVer);ﻩif(WSAStartup(sockVersion,&wsaData) != 0)ﻩexit(0);ﻩreturn1;}int main(){ﻩInitSock();//创建socket,第一个参数表示用IP协议,第二个参数表示用TCP传输,第三个不大清楚ﻩSOCKET s = socket(AF_INET,SOCK_STREAM, IPPROTO_TCP);if(s == INVALID_SOCKET){printf("Failed socket() \n");return 0;ﻩ}//用于存储IP地址和端口号的变量ﻩsockaddr_in servAddr;servAddr.sin_family =AF_INET;servAddr.sin_port =htons(4567);ﻩ//要连接的端口号servAddr.sin_addr.S_un.S_addr=inet_addr("127.0.0.1");//要连接的IP地址//连接函数,是一个阻塞类型的函数,用s这个socket与服务器地址的某个端口连接,之后往s这个socket中写数据,服务器就能收到ﻩif(connect(s, (sockaddr*)&servAddr, sizeof(servAddr)) == -1){ﻩﻩprintf("Failed connect()\n");ﻩreturn0;}char buff[256];ﻩchar szText[256];ﻩwhile(true){//接收函数,是一个阻塞类型的函数,等待s这个socket中传来数据,256表示接收的最大字符数ﻩintnRecv =recv(s,buff, 256, 0);ﻩif(nRecv>0)ﻩ{ﻩﻩbuff[nRecv] = '\0';ﻩprintf("receive:%s\n", buff);ﻩ}printf("send:");ﻩscanf("%s",szText);ﻩ//发送函数,往s这个socket中发送szText这个字符串ﻩsend(s,szText,strlen(szText),0);ﻩ}closesocket(s);ﻩWSACleanup();return 0;}2.TCP通信程序数据结构的描述(1)客户端及服务器都含有存储IP地址及端口号的数据结构,sockaddr_in remoteAddr;和servAddr(2)用于存储连接客户端的socket:SOCKET sClient;和用于存储连接服务器的socket:SOCKET s3.TCP通信程序的核心算法服务器首先启动,通过调用socket( )建立一个套接口,然后bind()将该套接口和本地地址(IP地址和端口)联系在一起,再listen( )使套接口做好侦听的准备,并规定它的请求队列的长度,之后就调用accept( )来接收连接,并获得客户机的地址信息;客户在建立套接口后就可调用connect() 和服务器建立连接;连接一旦建立,客户机和服务器之间就可以通过调用:send()和recv( )(或read( )和write())来发送和接收数据; 最后,待数据传送结束后,双方调用closesocket() 关闭套接口。

相关主题