收藏 分销(赏)

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

上传人:精**** 文档编号:3755471 上传时间:2024-07-16 格式:DOC 页数:18 大小:542.50KB
下载 相关 举报
UDP及TCP通信程序的设计与实现实验报告.doc_第1页
第1页 / 共18页
UDP及TCP通信程序的设计与实现实验报告.doc_第2页
第2页 / 共18页
UDP及TCP通信程序的设计与实现实验报告.doc_第3页
第3页 / 共18页
UDP及TCP通信程序的设计与实现实验报告.doc_第4页
第4页 / 共18页
UDP及TCP通信程序的设计与实现实验报告.doc_第5页
第5页 / 共18页
点击查看更多>>
资源描述

1、_实验报告课 程 计算机网络(双语)(课程设计) 实验名称 UDP及TCP通信程序的设计与实现 专业班级 姓 名 学 号 2013 年 5 月 30 日精品资料目录实验目的和内容1实验目的1实验内容1实验环境2程序的逻辑框图2UDP通信程序的逻辑框图:2TCP通信程序的逻辑框图:3程序源代码(数据结构的描述、核心算法)41.TCP通信程序源代码42.TCP通信程序数据结构的描述73.TCP通信程序的核心算法74.UDP通信程序源代码85.UDP通信程序数据结构的描述116.UDP通信程序的核心算法12实验数据、结果分析13TCP通信程序实验结果分析13UDP通信程序实验结果分析14总结16实验

2、目的和内容实验目的掌握win32平台下,使用winsock API来实现UDP通信程序和TCP通信程序。实验内容1. 实现控制台模式下,在单机上基于UDP的聊天程序;2. 实现控制台模式下,在单机上基于TCP的聊天程序;3. 上述两个程序,最简单的实现方式是:一方发送、另一方接收、交替进行;4. 提交上述2个程序的源程序,程序代码有充分的注释,并填写实验报告,实验报告的主要内容为说明程序设计的思路,程序代码的流程。实验环境在win7系统下,visual studio 2008环境下的win32平台下程序的逻辑框图UDP通信程序的逻辑框图:TCP通信程序的逻辑框图:程序源代码(数据结构的描述、核

3、心算法)1.TCP通信程序源代码Client端:#include stdafx.h#include #include #include #include /初始化函数,初始化版本号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 rbuf256;char szText256

4、;InitSock();/创建socket,第一个参数表示用IP协议,第二个参数表示用TCP传输,第三个不大清楚SOCKET sListen = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);/判断socket是否创建成功if(sListen = INVALID_SOCKET)printf(Failed socket() n);return 0;/用于存储IP地址和端口号的变量sockaddr_in sin;sin.sin_family = AF_INET;/IP协议sin.sin_port = htons(4567);/端口号sin.sin_addr.S

5、_un.S_addr = INADDR_ANY; /接收任何IP的连接/绑定函数,将socket 与 IP地址和端口 绑定在一块if(bind(sListen, (LPSOCKADDR)&sin, sizeof(sin) = SOCKET_ERROR)printf(Failed bind() n);return 0;/开始监听,第二个参数表示最大连接数if(listen(sListen, 2) = SOCKET_ERROR)printf(Failed listen() n);return 0;/定义一个新的变量sockaddr_in remoteAddr;int nAddrLen = size

6、of(remoteAddr);/用于存储连接客户端的socketSOCKET sClient;/accept函数会阻塞,直到等到有socket连接服务器为止,才继续往后执行,并将客户端的IP和端口号存在remoteAddr中sClient = accept(sListen, (SOCKADDR*)&remoteAddr, &nAddrLen);printf(接收到一个连接%s rn, inet_ntoa(remoteAddr.sin_addr);while(TRUE)if(sClient = INVALID_SOCKET)printf(Failed accept();continue;prin

7、tf(send:);scanf(%s,szText);/发送函数,往sClient这个socket中发送szTextsend(sClient, szText, strlen(szText), 0);/recv为阻塞函数,等待sClient中传来数据int nRecv = recv(sClient, rbuf, 256, 0);if(nRecv0)rbufnRecv = 0;printf(receive:%sn, rbuf);closesocket(sClient);closesocket(sListen);WSACleanup();return 0;Server端:#include stdaf

8、x.h#include #include #include #include /初始化函数,初始化版本号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()InitSock();/创建socket,第一个参数表示用IP协议,第二个参数表示用TCP传输,第三个不大清楚SOCKET s =

9、 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与服务

10、器地址的某个端口连接,之后往s这个socket中写数据,服务器就能收到if(connect(s, (sockaddr*)&servAddr, sizeof(servAddr) = -1)printf( Failed connect() n);return 0;char buff256;char szText256;while(true)/接收函数,是一个阻塞类型的函数,等待s这个socket中传来数据,256表示接收的最大字符数int nRecv = recv(s, buff, 256, 0);if(nRecv 0)buffnRecv = 0;printf(receive:%sn, buff)

11、;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通信程序的核心算法服务器首先启动,通过调用

12、socket( )建立一个套接口,然后bind( )将该套接口和本地地址(IP地址和端口)联系在一起,再listen( )使套接口做好侦听的准备,并规定它的请求队列的长度, 之后就调用accept( )来接收连接,并获得客户机的地址信息;客户在建立套接口后就可调用connect( ) 和服务器建立连接; 连接一旦建立,客户机和服务器之间就可以通过调用:send( )和recv( ) (或read( )和write( )来发送和接收数据; 最后,待数据传送结束后,双方调用closesocket() 关闭套接口。4.UDP通信程序源代码Client端:#include stdafx.h#inclu

13、de #include #include /在同一主机的不同端口上分别运行服务器程序和客户端程序WORD RPort = 6666; /远程端口RemotePortchar RIP16=127.0.0.1; /远程IP地址RemoteIPAddrWORD LPort = 7777; /本地端口LocalPortchar LIP16=127.0.0.1; /本地IP地址LocalIPAddrSOCKET S; /套接口SOCKETstruct sockaddr_in rAddr; /远程参数,remoteAddrstruct sockaddr_in lAddr; /本地参数,localAddrW

14、SADATA WD; /Winsock DLL信息int r; /result;/-void ShowInfo(char *info)puts(info);exit(1);/-void SetsockAddr(struct sockaddr_in *A,WORD Port,char *IP)A-sin_family = AF_INET; /TCP/IP协议A-sin_port = htons(Port); /端口A-sin_addr.s_addr =inet_addr(IP); /IP 地址/-void main( )WORD v; /wVersionRequested;/- - - - -

15、- - - Startup Win socket - - - - - - - -v=0x0101; /0x0101 for v1.1, 0x0002 forv 2.0r = WSAStartup(v, (LPWSADATA)&WD);if(r != 0)ShowInfo(Start_Error);/- - - - - - - - Create Win socket - - - - - - - -S = socket(AF_INET, SOCK_DGRAM, 0);/创建套接字if(S = -1)ShowInfo(socket_Create_Error);int l=sizeof(rAddr);

16、char Msg80;puts(Type exit then Quit Program!);SetsockAddr(&lAddr, LPort, LIP);/初始化变量lAddrr = bind(S,(struct sockaddr far *)&lAddr, sizeof(lAddr);if(r = -1)ShowInfo(bind_Error);SetsockAddr(&rAddr, RPort, RIP);do/- - - - - - - - Send Mess - - - - - - - -puts(Send:);gets(Msg);if(!strcmp(Msg,exit)/break

17、;r = sendto(S,Msg,strlen(Msg), 0,(struct sockaddr far *)&rAddr, l);/通过套接字向接收端发送信息if(r = -1)ShowInfo(Send_Error);/- - - - - - - - Recieve Mess - - - - - - - -puts(Send ok! Waiting Recieve.);/r = recv(S, Msg, 80,0);r = recvfrom(S,Msg,80,0,(struct sockaddr far *)&rAddr, &l);/发送套接口的主机地址信息存放在rAddr中if(r =

18、 -1)ShowInfo(Recieve_Error);Msgr=0;puts(Msg);puts(Recieve ok!);while(1);closesocket(S);WSACleanup();return ;Server端:#include stdafx.h#include #include #include /在同一主机的不同端口上分别运行服务器程序和客户端程序WORD RPort = 7777; /远程端口RemotePortchar RIP16=127.0.0.1; /远程IP地址RemoteIPAddrWORD LPort = 6666; /本地端口LocalPortchar

19、LIP16=127.0.0.1; /本地IP地址LocalIPAddrSOCKET S; /套接口SOCKETstruct sockaddr_in rAddr; /远程参数,remoteAddrstruct sockaddr_in lAddr; /本地参数,localAddrWSADATA WD; /Winsock DLL信息int r; /result;/-void ShowInfo(char *info)puts(info);exit(1);/-void SetsockAddr(struct sockaddr_in *A,WORD Port,char *IP)A-sin_family =

20、AF_INET; /TCP/IP协议A-sin_port = htons(Port); /端口A-sin_addr.s_addr =inet_addr(IP); /IP 地址/-void main( )WORD v; /wVersionRequested;/- - - - - - - - Startup Win socket - - - - - - - -v=0x0101; /0x0101 for v1.1, 0x0002 forv 2.0r = WSAStartup(v, (LPWSADATA)&WD);if(r != 0)ShowInfo(Start_Error);/- - - - - -

21、 - - Create Win socket - - - - - - - -S = socket(AF_INET, SOCK_DGRAM, 0);/创建套接字if(S = -1)ShowInfo(socket_Create_Error);int l=sizeof(rAddr);char Msg80;puts(Type exit then Quit Program!);SetsockAddr(&lAddr, LPort, LIP);/初始化变量lAddrr = bind(S,(struct sockaddr far *)&lAddr, sizeof(lAddr);if(r = -1)ShowIn

22、fo(bind_Error);SetsockAddr(&rAddr, RPort, RIP);do/- - - - - - - - Recieve Mess - - - - - - - -/puts(Send ok! Waiting Recieve.);/r = recv(S, Msg, 80,0);r = recvfrom(S,Msg,80,0,(struct sockaddr far *)&lAddr, &l);/发送套接口的主机地址信息存放在rAddr中if(r = -1)ShowInfo(Recieve_Error);Msgr=0;puts(Msg);puts(Recieve ok!)

23、;/- - - - - - - - Send Mess - - - - - - - -puts(Send:);gets(Msg);if(!strcmp(Msg,exit)/break;r = sendto(S,Msg,strlen(Msg), 0,(struct sockaddr far *)&lAddr, l);/通过套接字向接收端发送信息if(r = -1)ShowInfo(Send_Error);while(1);closesocket(S);WSACleanup();return ;5.UDP通信程序数据结构的描述(1)SOCKET S:服务器套接字(2)struct sockaddr

24、_in rAddr:远程参数,remoteAddr,存储TCP/IP协议,IP地址及端口号(3)struct sockaddr_in lAddr:本地参数,localAddr,存储TCP/IP协议,IP地址及端口号6.UDP通信程序的核心算法服务器首先启动,通过调用socket( )建立一个套接口,然后bind( )将该套接口和本地地址(IP地址和端口)联系在一起,服务器调用recvfrom ( )等待接收数据。 客户机通过调用socket( )建立一个套接口,然后bind( )将该套接口和本地地址(IP地址和端口)联系在一起,客户机调用sendto( )向服务器发送数据; 服务器的recvf

25、rom ( ) 接收到客户机的数据后,调用sendto( )向客户机发送应答数据; 客户机的recvfrom ( ) 便接收到了服务器的应答数据; 最后,待数据传送结束后,双方调用closesocket( )关闭套接口。关于程序中调用的库函数的几点说明:1. 对sendto函数的说明 int sendto( SOCKET s, /源套接口 char *buf, /待发送数据的缓冲区 int buflen, /缓冲区中数据的长度 int flags, /调用方式标志位,一般取0 struct sockaddr FAR *to, / 指向目的套接口的主机地址 int tolen /目的套接口主机地

26、址的长度 );sendto函数主要用于SOCK_DGRAM 类型套接口向to参数指定端的套接口发送数据报。对于SOCK_STREAM 类型套接口,to和tolen 参数被忽略;这种情况下sendto( ) 等价于send( ) 。 2. 对recvfrom函数的说明int recvfrom( SOCKET s /接收套接口 char *buf /接收数据的缓冲区 int len /缓冲区中数据的长度 int flags /调用方式标志位,一般取0 struct sockaddr FAR *from / 获取发送套接口的主机地址 int fromlen /发送套接口的主机地址的长度 );recv

27、from函数主要用于从一个套接口接收数据 实验数据、结果分析TCP通信程序实验结果分析:当Client端启动时,Server端收到来自Client端的信号,表明双方的连接已经建立,可以互相通讯,从client端发送“hello”, Server端收到来自Client端的“hello”, Server端也可以向client端发送信息。 UDP通信程序实验结果分析:打开UDP的client端,并打开UDP的server端,发送“hello”给server端,如下图所示:server端收到信息以后,发送“hi”给client端,client端也能收到信息。总结Welcome ToDownload !欢迎您的下载,资料仅供参考!

展开阅读全文
相似文档                                   自信AI助手自信AI助手
猜你喜欢                                   自信AI导航自信AI导航
搜索标签

当前位置:首页 > 包罗万象 > 大杂烩

移动网页_全站_页脚广告1

关于我们      便捷服务       自信AI       AI导航        获赠5币

©2010-2024 宁波自信网络信息技术有限公司  版权所有

客服电话:4008-655-100  投诉/维权电话:4009-655-100

gongan.png浙公网安备33021202000488号   

icp.png浙ICP备2021020529号-1  |  浙B2-20240490  

关注我们 :gzh.png    weibo.png    LOFTER.png 

客服