实验二 UDP通信实验 试验报告
通信软件实验报告基于UDP文件传输程序设计与实现
基于UDP的文件传输程序设计与实现(服务端)一、程序设计思路1.UDP(User Datagram Protocol,用户数据报协议)简介UDP为无连接的通信协议,其主要目的在于处理传输少量的数据。
与TCP 不同的是,UDP在传输数据之前不需要建立通信链接。
仅须设置计算机间的IP 及使用相同的端口,即可互相传输信息,因此UDP只提供单向的数据传输,如图1.1所示:图1.1 UDP通信协议由于UDP不须先建立连接,这样节省了TCP建立连接所需的时间,因此适合于在主机间做单向的数据传输。
但UDP不提供数据错误的侦测以及数据重送等功能,因此并不确保数据能完整发送。
2.java实现UDP程序思路UDP程序使用数据报的形式出现,需要使用以下两个类。
●数据报的内容:DatagramPacket。
●发送和接收数据报:DatagramSocket。
在开发TCP程序的时候,是先有服务端,之后再进行客户端的开发。
而UDP 要运行的时候,则应该先运行客户端,之后再运行服务端。
在运行UDP程序的时候先运行客户端,阻塞等待服务端发过来的信息,服务端开启后,向目标端发送信息之后便关闭了服务端,并不阻塞等待客户端的响应。
二、实现关键技术点1.服务端界面布局服务端界面使用的是边框布局管理器,边框布局管理器是每个JFrame的内容窗格的默认布局管理器。
流布局管理器完全控制每个组件的放置位置,边框布局管理器则不然,它允许为每个组件选择一个放置位置。
可以选择把组件放在内容窗格的中部、北部、南部、东部或者西部。
一般来讲是先放置边缘组件,剩余的可用空间由中间组件占据。
当容器缩放时,边缘组件的尺寸不会改变,而中部组件的大小会发生变化。
在添加组件时可以指定BorderLayout类中的CENTER、NORTH、SOUTH、EAST和WEST常量。
图2.1给出了服务器的界面布局:图2.1 UDP文件传输系统界面布局2.文件选择器Swing中提供了JFileChooser类,它可以显示一个文件对话框,其外观与本地应用程序中使用的文件的对话框基本一样。
02.UDP通讯实验
UDP通讯实验目录UDP通讯实验 (1)1本课题的目的 (2)2运行环境 (2)3课题分析 (2)3.1UDP 协议简介 (2)3.1.1UDP 协议简介 (2)3.1.2UDP 和TCP 协议的主要区别 (3)3.1.3UDP 协议的应用 (3)3.22.SOCKET 简介 (4)3.2.11)什么是Socket (4)3.2.22)Socket 建立 (4)3.2.33)Socket 配置 (5)3.2.44)连接建立 (6)3.2.55)数据传输 (7)3.2.66)结束传输 (8)4系统设计 (9)5技术实现问题 (17)6总结与体会 (17)1本课题的目的编程实现嵌入式开发平台和计算机之间的UDP 通讯。
通过触摸屏进行画图,使其在液晶屏上显示,同时通过网络传输数据,使其在计算机屏幕上显示;由计算机控制清除液晶屏上的图形。
在此基础上,通过小键盘控制在触摸屏上绘制的图形,如按键后控制绘矩形或圆形等,通过双击清屏等功能。
2运行环境安装在ARM板上的uc-os操作系统3课题分析3.1UDP 协议简介3.1.1UDP 协议简介UDP 协议是英文User Datagram Protocol的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络应用。
包括网络视频会议系统在内的众多客户/ 服务器模式的网络应用都需要使用UDP 协议。
UDP协议从问世至今已经被使用了很多年,虽然其最初的光彩已经被一些类似协议所掩盖,但即使是在今天,UDP仍然不失为一项非常实用和可行的网络传输层协议。
与我们所熟知的TCP(传输控制协议)协议一样,UDP协议直接位于IP(网际协议)协议的顶层。
根据OSI(开放系统互连)参考模型,UDP 和TCP 都属于传输层协议。
UDP 协议的主要作用是将网络数据流压缩成数据报的形式。
一个典型的数据报就是一个二进制数据的传输单位。
每一个数据报的前8 个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。
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通信程序。
UDP及TCP通信程序的设计与实现实验报告
实验报告课程计算机网络(双语)(课程设计)实验名称UDP及TCP通信程序的设计与实现专业班级姓名学号2013 年 5 月30 日目录实验目的和内容 (1)实验目的 (1)实验内容 (1)实验环境 (2)程序的逻辑框图 (2)UDP通信程序的逻辑框图: (2)TCP通信程序的逻辑框图: (3)程序源代码(数据结构的描述、核心算法) (4)1.TCP通信程序源代码 (4)2.TCP通信程序数据结构的描述 (7)3.TCP通信程序的核心算法 (7)4.UDP通信程序源代码 (8)5.UDP通信程序数据结构的描述 (11)6.UDP通信程序的核心算法 (12)实验数据、结果分析 (13)TCP通信程序实验结果分析 (13)UDP通信程序实验结果分析 (14)总结 (16)实验目的和内容实验目的掌握win32平台下,使用winsock API来实现UDP通信程序和TCP通信程序。
实验内容1.实现控制台模式下,在单机上基于UDP的聊天程序;2.实现控制台模式下,在单机上基于TCP的聊天程序;3.上述两个程序,最简单的实现方式是:一方发送、另一方接收、交替进行;4.提交上述2个程序的源程序,程序代码有充分的注释,并填写实验报告,实验报告的主要内容为说明程序设计的思路,程序代码的流程。
实验环境在win7系统下,visual studio 2008环境下的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传输,第三个不大清楚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_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 = 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(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 = 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");return 0;}char buff[256];char szText[256];while(true){//接收函数,是一个阻塞类型的函数,等待s这个socket中传来数据,256表示接收的最大字符数int nRecv = 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() 关闭套接口。
数据通信实习报告
数据通信实习报告
一、实习概况
本次实习是在浙江一家信息技术公司完成数据通信方面的实习。
实习
主要以实验室为实习基础,在实习期间,对公司正在开发的局域网数据通
信系统做详细研究,完成实验室里针对数据通信的网络实验,实验以实现
简单的UDP通信和TCP报文序列发送为主要实验内容,实习周期为两个月,时间从2024年1月1日到2024年3月1日。
二、实习内容
1.实验室整体设备介绍:
实验室内的设备包括两台计算机、一台网络打印机、一台网络路由器、一台数据交换机、一台服务器以及一个集线器,所有设备均是该实验室的
主要设备。
2.硬件设备以及实验环境介绍:
实验期间,依据实验室要求,将两台电脑安装了:网络操作系统(Ubuntu)、网络调试软件(Wireshark)和网络虚拟机(Virtualbox),以及其它必要的软件;同时,将网络路由器和数据交换机进行了IP地址
划分和设置,并且连接计算机,最终形成了实验环境。
3.所做实验项目介绍:
(1)UDP数据通信实验:通过实验室提供的计算机,实现两台计算
机之间的UDP数据通信,即使用UDP协议发送数据,最终实现数据在发送
方和接收方的传输。
udp实验报告
udp实验报告UDP实验报告引言:UDP(User Datagram Protocol)是一种无连接的传输协议,它在网络通信中扮演着重要的角色。
本实验旨在通过对UDP协议的实际应用,深入了解其特点和工作原理。
一、UDP的特点UDP与TCP相比,具有以下几个显著特点:1. 无连接:UDP在发送数据之前不需要建立连接,因此传输效率更高。
2. 不可靠:UDP不提供可靠的数据传输保证,数据包可能丢失、顺序错乱或重复。
3. 高效:UDP的头部开销较小,适用于对实时性要求较高的应用场景。
4. 简单:UDP的实现相对简单,占用的系统资源较少。
二、UDP的应用场景UDP广泛应用于以下场景:1. 实时通信:如音频、视频传输、实时游戏等。
由于UDP的低延迟特性,适合于对实时性要求较高的应用。
2. DNS(Domain Name System):域名解析过程中,UDP用于快速传输查询请求和响应。
3. SNMP(Simple Network Management Protocol):网络管理中,UDP用于传输管理信息。
4. TFTP(Trivial File Transfer Protocol):简单文件传输协议,基于UDP实现。
三、实验目的本实验旨在通过编写UDP程序,验证UDP协议的特点和应用场景。
四、实验环境与工具1. 操作系统:Windows 102. 编程语言:Python3. 开发工具:PyCharm4. 网络模拟器:GNS3五、实验步骤1. 设计并实现一个基于UDP的简单聊天程序,包括客户端和服务器端。
2. 在GNS3网络模拟器中配置两台虚拟机,分别作为客户端和服务器端。
3. 在客户端和服务器端分别运行聊天程序,并进行通信测试。
4. 分析测试结果,验证UDP协议的特点。
六、实验结果与分析通过测试,我们得到了以下实验结果:1. UDP传输速度较快:在实时聊天过程中,消息几乎是即时传输的,延迟较低。
2. 数据包丢失现象:由于UDP不提供可靠的传输保证,部分数据包可能会丢失,导致聊天内容不完整。
udp实验报告 计算机网络
udp实验报告计算机网络
《UDP实验报告-计算机网络》
一、实验目的
本实验旨在通过对UDP协议的实验,加深对计算机网络中传输层协议的理解,
掌握UDP协议的特点、优缺点以及适用场景。
二、实验环境
本次实验使用了一台服务器和一台客户端,它们通过局域网连接,并且安装了
相应的网络调试工具和UDP通信软件。
三、实验内容
1. UDP协议的特点
UDP是用户数据报协议,是一种无连接的、不可靠的传输协议。
它不需要建立
连接,也不保证数据的可靠性和顺序性,因此传输效率较高。
2. UDP协议的优缺点
优点:UDP协议的头部开销小,传输效率高;适用于实时性要求较高的应用场景,如视频会议、在线游戏等。
缺点:UDP协议不提供可靠性保证,容易丢包;不支持拥塞控制和流量控制,
对网络负载和稳定性要求较高。
3. UDP协议的适用场景
UDP适用于实时性要求高、数据量较小、对可靠性要求不高的应用场景,如音频、视频的实时传输,以及一些简单的网络通信协议。
四、实验结果
通过对UDP协议的实验,我们成功地实现了服务器和客户端之间的UDP通信,
实时传输了一些简单的文本数据,并观察到了UDP协议的特点和优缺点。
五、实验总结
本次实验使我们更深入地了解了UDP协议的特点、优缺点以及适用场景,对于今后的网络应用开发和调试工作具有重要的参考价值。
六、实验感想
通过本次实验,我们对计算机网络中的传输层协议有了更深入的理解,也增强了我们对网络通信技术的兴趣,希望能够在未来的学习和工作中更好地应用所学知识。
协议分析udp实验报告
协议分析udp实验报告
本次实验旨在通过对UDP(User Datagram Protocol)协议的分析,深入了解其工作原理、特点及应用,并学习使用Wireshark工具进行协议分析。
实验步骤:
1. 实验前准备:
a. 搭建实验环境,包括安装Wireshark工具、配置网络连接等;
b. 确定实验所使用的网络拓扑结构,包括发送端和接收端的IP地址、端口号等。
2. 实验过程:
a. 启动Wireshark并选择相应的网络接口进行监听;
b. 在发送端发送UDP数据包到指定的接收端;
c. 使用Wireshark工具分析捕获到的数据包,并观察UDP协议的工作过程。
3. 实验结果分析:
a. Wireshark捕获到的数据包中可以看到UDP的相关信息,包括源端口号、目的端口号、校验和等;
b. UDP协议是一种无连接的协议,因此不需要建立和断开连接,不会进行握手和挥手过程;
c. UDP协议是一种不可靠的协议,不具备传输可靠性和顺序性的功能,但传输速度快;
d. UDP协议可以实现一对一、一对多、多对多等多种数据传输方式;
e. UDP协议适用于对实时性要求较高、数据传输量较小且要求速度较快的应用场景,如音视频传输、网络游戏等。
4. 实验总结:
通过本次实验,我们了解了UDP协议的工作原理和特点,并学会了使用Wireshark工具进行协议分析。
UDP协议具有无连接、不可靠、速度快等特点,适用于对实时性要求较高的应用场景。
在实际应用中,我们应根据具体的需求和情况选择合适的协议进行数据传输。
另外,通过协议分析可以帮助我们深入理解网络协议的工作机制,提高网络技术的应用能力。
TCP_UDP通信过程学习及实验报告[五篇]
TCP_UDP通信过程学习及实验报告[五篇]第一篇:TCP_UDP通信过程学习及实验报告1.当两台计算机分别和中继器、二层交换机、三层交换、路由器相连时,请分别画出计算机与交换设备五层参考模型;计算机A应用层计算机B应用层传输层传输层网络层网络层数据链路层数据链路层中继器物理层物理层物理层计算机A应用层计算机B应用层传输层传输层网络层二层交换机数据链路层网络层数据链路层数据链路层物理层物理层物理层计算机A应用层计算机B应用层传输层三层交换机网络层传输层网络层网络层数据链路层数据链路层数据链路层物理层物理层物理层计算机A应用层计算机B应用层传输层路由器网络层传输层网络层网络层数据链路层数据链路层数据链路层物理层物理层物理层2.学习SOCKET编程,写出TCP、UDP通信流程;将实例程序两个同学一组,实现两台计算机之间通信。
并写出学习报告;(a)TCP通信流程准备阶段:服务器程序首先进行初始化操作:(1)调用socket创建一个套接字(2)函数bind将这个套接字与服务器公认地址绑定在一起(3)函数listen将这个套接字转换成倾听套接字(listening socket)(4)调用函数accept来接受客户机的请求。
客户机程序初始化操作:(1)客户机调用函数socket创建一个套接字(2)调用函数connect 来与服务器建立连接。
连接建立之后,客户机与服务器通过读(read())、写(write())套接字来进行通信。
如下图:服务器端SocketTCP通信流程客户端bindSocketListenconnectwritesendsendwritecloseclose(b)UDP通信流程准备阶段:服务器程序首先进行初始化操作:(1)调用socket创建一个套接字(2)函数bind将这个套接字与服务器公认地址绑定在一起客户机程序初始化操作:(1)客户机调用函数socket创建一个套接字客户机与服务器通过读(sendto())、写(recvfrom())套接字来进行通信。
udp实验报告 计算机网络
udp实验报告计算机网络UDP实验报告一、引言计算机网络是现代社会中不可或缺的一部分,它使得信息的传输和共享变得更加便捷和高效。
在计算机网络中,UDP(User Datagram Protocol)是一种无连接的传输层协议,它与TCP(Transmission Control Protocol)相比,具有更低的开销和更高的传输速度。
本实验旨在通过实际操作和测试,深入了解UDP协议的特性和应用。
二、实验目的1. 了解UDP协议的基本特性和工作原理;2. 掌握UDP协议的使用方法和应用场景;3. 通过实验测试,分析UDP协议的性能和优缺点。
三、实验环境本次实验使用了一台运行Windows操作系统的计算机,该计算机与另一台运行Linux操作系统的计算机通过局域网相连。
四、实验步骤1. 安装并配置UDP服务器和客户端软件;2. 在服务器端设置监听端口,并等待客户端的连接请求;3. 在客户端发送UDP数据包到服务器端;4. 服务器端接收并处理客户端发送的数据包;5. 分析实验结果,记录传输速度、丢包率等数据。
五、实验结果与分析通过实验测试,我们得到了以下结果和分析:1. 传输速度:UDP协议具有较高的传输速度,因为它不需要建立连接和维护状态。
在我们的实验中,UDP协议的传输速度明显快于TCP协议,适用于对实时性要求较高的应用场景,如音视频传输。
2. 丢包率:由于UDP协议的无连接特性,它对数据包的丢失不负责任。
在实验中,我们发现UDP协议的丢包率较高,这意味着在传输过程中可能会丢失部分数据包。
因此,在对数据可靠性要求较高的应用场景中,不适合使用UDP协议。
3. 应用场景:UDP协议适用于需要快速传输和实时性较高的应用场景,如音视频传输、在线游戏等。
它可以提供较低的延迟和更好的用户体验。
但是,由于UDP协议的不可靠性,需要在应用层进行数据包的重传和错误校验等处理。
六、实验总结通过本次实验,我们对UDP协议有了更深入的了解。
UDP报文分析实验报告范文udp实验结果及分析
UDP报文分析实验报告范文udp实验结果及分析实验报告实验名称UDP报文分析姓名学号实验日期2015.09.17实验报告要求:1.实验目的2.实验要求3.实验环境4.实验作业【实验目的】1.复习Wireshark抓包工具的使用及数据包分析方法;2.分析UDP报文3.校验和检验【实验要求】用Wireshark1.12.3截UDP包,分析数据包。
【实验环境】用以太网交换机连接起来的windows8.1操作系统的计算机,通过iNode客户端接入Internet。
【实验作业】1.截包在Filter处输UDP截到的没有UDP,选udpencap后截到UDP报文。
UDP是封装在IP里的。
2.报文字段分析=1\*GB3①源端口源端口号是8000。
关于端口号有一些规定,服务器端通常用知名端口号,通常在0-1023之间。
而客户端用随机的端口号,其范围在49152到65535之间。
=2\*GB3②目的端口=3\*GB3③报文长度=4\*GB3④校验和=5\*GB3⑤数据3.校验和计算(与IP首部校验和计算方法相同)=1\*GB3①UDP的校验和所需信息:UDP伪首部:源IP+目的IP+Byte0+Byte17+UDP长度,其目的是让UDP两次检查数据是否已经正确到达目的地,只是单纯为了做校验用的。
UDP首部:该长度不是报文的总长度,而只是UDP(包括UDP头和数据部分)的总长度UDP的数据部分。
=2\*GB3②计算步骤把伪首部添加到UDP上;计算初始时将校验和字段添零的;把所有位划分为16位(2字节)的字;把所有16位的字相加,如果遇到进位,则将高于16字节的进位部分的值加到最低位上。
将所有字相加得到的结果应该为一个16位的数,将该数按位取反则可以得到校验和。
=3\*GB3③计算由上图可知源IP:111.161.88.16、目的IP:10.104.113.47、UDP 长度:47和数据。
计算后得校验和正确。
成绩优良中及格不及格教师签名:日期:。
实验二UDP通信实验试验报告
实验二UDP通信实验试验报告UDP通信实验一、实验目的1.进一步理解Winsock编程接口的调用方法。
2.了解UDP协议的工作原理,掌握UDP服务端程序和客户端程序的编写过程,熟悉程序的测试方法。
二、实验过程1.调试实验带的代码,使之能运行。
2.修改代码使服务端和客户端能互发信息,并能正确接受到。
3.进一步修改代码,当任何一方发送字符“bye” 程序就结束三、实验代码(1)UDPServer#includeiostream.h#include winsock2.h#include stdio.h#pragma comment(lib,“WS2_32“)class CInitSock{public:CInitSock(BYTE minorVer=2,BYTE majorVer=2){***** wsaData;WORD sockVersion=*****D(minorVer,majorVer);if(::WSAStartup(sockVersion,wsaData)!=0){exit(0);}}~CInitSock(){::WSACleanup();}};CInitSock initSock; // 初始化Winsock库int main(){// 创建套节字SOCKET s = ::socket(AF_INET, SOCK_DGRAM, *****_UDP); if(s == *****_SOCKET){printf(“Failed socket() \n");return 0;}// 填充sockaddr_in结构sockaddr_in sin;sin.sin_family = AF_INET;sin.sin_port = htons(4567);sin.sin_addr.S_un.S_addr = INADDR_ANY;// 绑定这个套节字到一个本地地址if(::bind(s, (*****DDR)sin, sizeof(sin)) == SOCKET_ERROR) {printf("Failed bind() \n");return 0;}// 接收数据char buff;sockaddr_in addr;int nLen = sizeof(addr);while(TRUE){int nRecv = ::recvfrom(s, buff, 1024, 0, (sockaddr*)addr, nLen); if(nRecv 0){buff[nRecv] = '\0';printf(" 接收到数据(%s):%s", ::inet_ntoa(addr.sin_addr), buff); if(strcmp(buff,"bye")==0)break;char szText ;cinszText;::sendto(s, szText, strlen(szText), 0, (sockaddr*)addr, sizeof(addr)); } }printf("\n");::closesocket(s);(2)UDPClient#includeiostream.h#include winsock2.h#include stdio.h#pragma comment(l ib,“WS2_32")class CInitSock{public:CInitSock(BYTE minorVer=2,BYTE majorVer=2){***** wsaData;WORD sockVersion=*****D(minorVer,majorVer);if(::WSAStartup(sockVersion,wsaData)!=0){exit(0);}}~CInitSock(){::WSACleanup();}};CInitSock initSock; // 初始化Winsock库int main(){// 创建套节字SOCKET s = ::socket(AF_INET, SOCK_DGRAM, *****_UDP); if(s == *****_SOCKET){printf("Failed socket() %d \n", ::WSAGetLastError());return 0;}// 也可以在这里调用bind函数绑定一个本地地址// 否则系统将会自动安排// 填写远程地址信息sockaddr_in addr;addr.sin_family = AF_INET;addr.sin_port = htons(4567);// 注意,这里要填写服务器程序所在机器的IP地址// 如果你的计算机没有联网,直接使用.0.0.1即可addr.sin_addr.S_un.S_addr = inet_addr(“127.0.0.1");// 发送数据// char szText[] = "ha";//::sendto(s, szText, strlen(szText), 0, (sockaddr*)addr, sizeof(addr));// 接收数据char buff;//sockaddr_in addr;int nLen = sizeof(addr);while(TRUE){// 发送数据char szText ;cinszText;::sendto(s, szText, strlen(szText), 0, (sockaddr*)addr, sizeof(addr));int nRecv = ::recvfrom(s, buff, 1024, 0, (sockaddr*)addr, nLen); if(nRecv 0){buff[nRecv] = '\0';printf(" 接收到数据(%s):%s", ::inet_ntoa(addr.sin_addr), buff); } if(strcmp(buff,"bye")==0)break;}printf("\n");::closesocket(s);return 0;}四、实验结果UDPServerUDPClient五、实验总结这次实验比较简单,运行的时候要先运行服务端,再运行客户端。
计算机网络实验报告udp
计算机网络实验报告udp计算机网络实验报告:UDP协议摘要:本实验报告旨在介绍计算机网络中的UDP(用户数据报协议)协议。
首先,我们将简要介绍UDP的基本概念和特点。
然后,我们将通过实验验证UDP协议的可靠性和性能。
最后,我们将讨论UDP协议的应用场景和局限性。
1. 引言计算机网络是现代社会中不可或缺的一部分,而协议是网络通信的基石。
UDP 是一种简单的传输层协议,它提供了无连接、不可靠的数据传输服务。
相对于TCP协议,UDP具有更低的开销和更高的传输效率,但也因此牺牲了可靠性。
2. UDP的特点UDP协议具有以下特点:- 无连接:UDP不需要在通信前建立连接,而是直接将数据报发送给接收方。
- 不可靠:UDP不提供数据重传和确认机制,因此无法保证数据的可靠传输。
- 高效性:UDP的头部开销较小,传输效率较高。
- 面向报文:UDP以数据报的形式传输数据,每个数据报都是独立的,不会像TCP那样将数据流划分为多个段。
3. 实验验证为了验证UDP协议的可靠性和性能,我们进行了一系列实验。
首先,我们在本地搭建了一个简单的UDP服务器和客户端。
然后,我们通过发送不同大小的数据报和模拟网络延迟来测试UDP的可靠性和传输速度。
实验结果表明,UDP协议在局域网环境下具有较高的可靠性。
即使在网络延迟较高的情况下,UDP仍能够正常传输数据。
然而,在广域网环境下,UDP的可靠性会受到较大影响,因为UDP无法保证数据的可靠传输,可能会导致丢包或乱序。
另外,我们还测试了UDP协议的传输速度。
实验结果显示,UDP协议在传输大量数据时具有较高的传输效率,特别适合实时音视频传输等对传输速度要求较高的应用场景。
4. 应用场景UDP协议由于其高效性和低延迟的特点,被广泛应用于以下场景:- 实时音视频传输:如视频会议、直播等。
- DNS解析:UDP协议用于域名解析,由于DNS请求通常较小且需要快速响应,UDP更适合用于此类场景。
- 游戏通信:游戏中的实时交互需要低延迟和高效的数据传输,UDP协议能够满足这些要求。
QT实验九网络实验二UDP通信
网络实验二UDP通信UDP(User Datagram Protocol 即用户数据报协议)一个不可靠的,面向数据报的无连接协议。
简单的例子:现在几乎每个人都使用的腾讯QQ,其聊天时就是使用UDP 协议进行消息发送的。
就像QQ 那样,当有很多用户,发送的大部分都是短消息,要求能及时响应,并且对安全性要求不是很高的情况下使用UDP 协议。
Qt 中提供了QUdpSocket 类来进行UDP 数据报(datagrams)的发送和接收。
名词Socket,也就是常说的“套接字”。
Socket 简单地说,就是一个IP 地址加一个port端口。
因为要传输数据,就要知道往哪个机子上传送,而IP 地址确定了一台主机,但是这台机子上可能运行着各种各样的网络程序,我们要往哪个程序中发送呢?这时就要使用一个端口来指定UDP 程序。
所以说,Socket 指明了数据报传输的路径。
编写两个程序,一个用来发送数据报,叫做客户端;另一个用来接收数据报,叫做服务器端,均应用UDP 协议。
这样也就构成了所谓的C/S(客户端/服务器)编程模型。
建立一个GUI application 工程,基类选择widget,工程文件*.pro中加入:QT += network1)main.cpp修改如下:#include <QApplication>#include "widget.h"#include <QTextCodec>int main(int argc, char *argv[]){QApplication a(argc, argv);QTextCodec::setCodecForTr(QTextCodec::codecForName("gbk"));QTextCodec::setCodecForCStrings(QTextCodec::codecForName("gbk"));Widget w;w.show();return a.exec();}2)widget.cpp修改如下:#include "widget.h"#include "ui_widget.h"#include <qdatetime.h>#include <QTextCodec>Widget::Widget(QWidget *parent) :QWidget(parent),ui(new Ui::Widget){ui->setupUi(this);configFlag = false; //初始化连接参数为未连接ui->getTextEdit->ensureCursorVisible();ui->sendTextEdit->setFocus(); //程序启动时,焦点停在发送对话框ui->ipEdit->setText("192.168.2.77"); //设置默认的远程端Ipui->portEdit->setText("6667"); //设置默认远程端口号//关联快捷键ui->udpSendButton->setShortcut(tr("Alt+F"));localIpStr = getIp();localHostAddr = new QHostAddress(localIpStr);udpSocket1 = new QUdpSocket(this);bool bindFlag = udpSocket1->bind(*localHostAddr, 6665, QUdpSocket::ShareAddress);//6665为本地端口if(!bindFlag){QMessageBox box;box.setText(tr("初始化绑定socket错误!"));box.exec();}else{connect(udpSocket1, SIGNAL(readyRead()), this, SLOT(receive()));connect(ui->udpSendButton, SIGNAL(clicked()), this, SLOT(send()));}this->setWindowTitle(tr("基于Qt的UDP通信程序"));}void Widget::send(){autoScroll();QString sendStr = ui->sendTextEdit->toPlainText();QByteArray sendByteArray = sendStr.toAscii();QMessageBox box;if(sendStr.length()==0){box.setText(tr("请输入发送内容"));box.exec();}else if(configFlag){udpSocket1->writeDatagram(sendByteArray, sendByteArray.length(), *remoteHostAddr, 6667);//上面使用远程端口//本地发送信息再信息交互窗口的显示QDateTime time;QString timeStr = time.currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");ui->getTextEdit->setTextColor(QColor("red"));ui->getTextEdit->insertPlainText("本机" + localIpStr + ": " + timeStr + "\n");ui->getTextEdit->setTextColor(QColor("black"));ui->getTextEdit->insertPlainText( sendStr +"\n");ui->sendTextEdit->clear(); //点击发送后,发送编辑框内清零ui->sendTextEdit->setFocus(); //焦点停留在发送编辑框}else if(!configFlag){box.setText("请您先点击确认按钮!");box.exec();}}void Widget::receive()while(udpSocket1->hasPendingDatagrams()){QTextCodec *tc=QTextCodec::codecForName("gbk"); //gbkQDateTime time;QString timeStr = time.currentDateTime().toString("yyyy-MM-dd hh:mm:ss ddd");QByteArray data;data.resize(udpSocket1->pendingDatagramSize());udpSocket1->readDatagram(data.data(), data.size());QString dataStr = tc->toUnicode(data);ui->getTextEdit->setTextColor(QColor("red"));ui->getTextEdit->insertPlainText("远程" + remoteIpStr+": "+ timeStr +"\n" );ui->getTextEdit->setTextColor(QColor("black"));ui->getTextEdit->insertPlainText(dataStr + "\n" );autoScroll();}}QString Widget::getIp(){QList<QHostAddress> list = QNetworkInterface::allAddresses();foreach (QHostAddress address, list){if(address.protocol() == QAbstractSocket::IPv4Protocol) //我们使用IPv4地址{if(address.toString().contains("127.0."))continue;qDebug()<<"本机Ip:"<<address.toString();return address.toString();}}return 0;}void Widget::autoScroll(){QTextCursor cursor = ui->getTextEdit->textCursor();cursor.movePosition(QTextCursor::End);ui->getTextEdit->setTextCursor(cursor);}Widget::~Widget(){delete ui;}void Widget::on_clearButton_clicked(){ui->getTextEdit->clear();}void Widget::on_configButton_clicked(){remoteIpStr = ui->ipEdit->text();QString port = ui->portEdit->text();qDebug()<<"远程端Ip:"<<remoteIpStr<<"端口号:"<<port;remoteHostAddr = new QHostAddress(remoteIpStr);QMessageBox box;if(remoteIpStr.length()==0 || port.length()==0 || port.toInt()<1024) {configFlag = false;box.setText("请正确设置远程端Ip地址和端口号!");box.exec();}else{configFlag = true;box.setText("您设置的远程端Ip:" + remoteIpStr+"端口号:"+port);box.exec();}}void Widget::on_exitButton_clicked(){this->close();}3) widget.h 修改如下:#ifndef WIDGET_H#define WIDGET_H#include <QWidget>#include <QtNetwork/QUdpSocket>#include <QtNetwork/QHostAddress>#include <QMessageBox>#include <QHostInfo>#include <QNetworkInterface>namespace Ui {class Widget;}class Widget : public QWidget{Q_OBJECTpublic:explicit Widget(QWidget *parent = 0);~Widget();QHostAddress *localHostAddr;QHostAddress *remoteHostAddr;QString localIpStr;QString remoteIpStr;QString getIp();void autoScroll();private slots:void send();void receive();void on_clearButton_clicked();void on_configButton_clicked();void on_exitButton_clicked();private:Ui::Widget *ui;QUdpSocket *udpSocket1;bool configFlag; };#endif // WIDGET_H4)建立widget.ui 如上图所示。
UDP实验报告
UDP客户/服务器应用程序设计姓名:学号:班级:一.实验名称UDP客户/服务器应用程序设计二.实验要求编程实现一个聊天室系统。
该系统包括客户端和服务器端两部分。
用户通过客户端发送消息。
服务器端在收到消息后,显示在主界面上。
要求还能实现广播功能。
实验报告要求有实现过程的流程图,对主要的函数及其参数给予说明,要有实现过程的主要程序段,并对各段程序的功能及作用进行说明。
三.程序实现流程图四.编程使用的主要函数1. int WSAStartup(WORD wVersionRequested,LPWSADATA lpWSAData);初始化套接字库函数。
使用Socket之前必须调用此函数,当一个应用程序调用WSAStartup函数时,操作系统根据请求的Socket版本来搜索相应的Socket库,然后绑定找到的Socket库到该应用程序中,以后应用程序就可以调用所请求的Socket库中的其它Socket函数了。
参数wVersionRequested表示当前套接字库的版本号,参数lpWSAData是指向结构体WSADATA的指针变量,表示获取套接字库的详细信息,函数调用成功返回0。
2.SOCKET socket(int af,int type,int protocol)创建网络通信套接字句柄。
参数af指定套接字所使用的地址格式,对于TCP/IP协议族,该参数置PF_INET;type是表示套接字的类型,采用流套接字类型用SOCK_STREAM,数据报套接字类型使用SOCK_DGRAM;protocol表示应用程序使用的通讯协议,一般写0表示对两种类型的Socket分别采用默认的TCP或UDP传输协议,函数调用成功返回新建套接字的句柄,否则返回INVALID_SOCKET。
3.int bind(SOCKET s,struct sockaddr_in* name,int namelen)绑定地址信息.对服务器而言套接字创建成功后,应将套接字与地址结构信息进行绑定,第一个参数s为套接字句柄,第二个参数地质结构信息,第三个参数地质结构的大小。
实验二:基于TCPUDP的Socket编程
实验二:基于TCP/UDP的Socket编程[实验目的]:熟悉和掌握socket编程的基本理论和方法。
掌握基于TCP和UDP的工作原理以及Socket编程的一般方法,能够编写简单的网络应用程序。
[实验要求]:请在以下题目中选择一个,按照要求完成实验,并完成实验报告。
实验不分组。
编程可以使用任何高级语言,建议使用java或C++。
实验2.1:基于TCP and UDP的socket编程1、实验内容:a)利用Java或C++语言,分别基于TCP和UDP编写一个简单的Client/Server网络应用程序。
要求实现客户向服务器传输任意一个字符串,服务器将收到的字符串变换成大写后传回客户。
b)修改上述程序,实现服务器根据客户请求,将服务器端指定的文件可靠地传输给客户。
如果服务器没有指定的文件,服务器将给客户返回一个信息,通知客户其请求文件不存在。
c)有条件的同学可以进一步改进b)的程序,使之更实用。
比如可以请求服务器先传输目录,然后客户根据目录请求传输文件等。
2、实验方式:每位同学上机编程实验,实验指导教师现场指导。
程序可参考附录的程序1、程序2、程序3和程序4(程序中有错误需完善)3、实验报告:在实验报告中要说明Socket编程的客户端和服务器端主要步骤、利用Java语言用到的主要类及其主要作用、TCP和UDP编程的主要差异和特点、你所实现的文件传输的程序代码、实验过程和实验结果。
Client端java程序源代码:package internet;import java.io.*;import .*;class client{public static void main(String argv[]) throws Exception{String sentence; //声明字符串变量用于存储字符串输入和传送String modifiedSentence;//从服务器得到,并送到用户标准输出System.out.println("请输入将要转换的字符串");BufferedReader inFromUser = new BufferedReader( //创建inFromUser程序的输入流new InputStreamReader(System.in)); //将流连接到标准输入Socket clientSocket = new Socket("192.168.28.212",3579);//clientSocket为定义的套接字DataOutputStream outToServer = newDataOutputStream( //DataOutputStream包含在java.io.*包中clientSocket.getOutputStream());BufferedReader inFromServer = //inFromServer 连接套接字的输入流new BufferedReader(newInputStreamReader( //BufferedReader包含在java.io.*包中 clientSocket.getInputStream()));sentence = inFromUser.readLine(); //将用户输入的一行读入到sentence中outToServer.writeBytes(sentence + '\n'); //outToServer 程序的输出流modifiedSentence = inFromServer.readLine();//当到达服务器时,他们进入modifiedSentence字符串中System.out.println("通过服务器端已将该字符串转换完成");System.out.println("转换为内容为:"+modifiedSentence);//将服务器返回来的modifiedSentence打印到监视器上clientSocket.close(); //关闭套接字,tcp连接也随之关闭}}Client端java程序截图:Server端java程序源代码:package net;import java.io.*;import .*;class server{public static void main(String argv[]) throws Exception{String clientSentence; //声明字符串变量用于存储字符串输入和传送 String capitalizedSentence; //从从客户端得到ServerSocket welcomeSocket = new ServerSocket(3579);//创建welcomeSocket对象,在3579端口进行监听while(true){Socket connectionSocket = welcomeSocket.accept();//获取从客户端传来的字符BufferedReader infromClient =new BufferedReader(newInputStreamReader( //BufferedReader包含在java.io.*包中 connectionSocket. getInputStream()));DataOutputStream outToClient = //outToClient程序的输出流new DataOutputStream(connectionSocket.getOutputStream());clientSentence = infromClient. readLine(); //把用户输入的送入clientSentence中capitalizedSentence =clientSentence.toUpperCase() + '\n';//将发送行中的小写转换成大写outToClient.writeBytes(capitalizedSentence);}}}Server端java程序截图:程序最终运行结果:计算机网络实验报告指导教师:唐树刚班级:08计算机1班学号:20081846姓名:王雪松。
TCPUDP通信实验报告
TCP/UDP 通信实验报告学号:姓名:实验二:TCP/UDP通信实验报告一、实验目的熟练掌握UDP、TCP Client/Server 模式的通信原理。
二、实验内容传输控制协议(Transport Control Protocol)是一种面向连接的,可靠的传输层协议。
面向连接是指一次正常的TCP 传输需要通过在TCP 客户端和TCP 服务端建立特定的虚电路连接来完成,该过程通常被称为“三次握手”。
可靠性可以通过很多种方法来提供保证,在这里我们关心的是数据序列和确认。
TCP 通过数据分段(Segment)中的序列号保证所有传输的数据可以在远端按照正常的次序进行重组,而且通过确认保证数据传输的完整性。
要通过TCP 传输数据,必须在两端主机之间建立连接。
举例说明,TCP 客户端需要和TCP 服务端建立连接,过程如图12-1 所示。
图12-1 TCP 客户端与服务端连接过程①、第一步中,客户端向服务端提出连接请求。
这时TCP SYN 标志置位。
客户端告诉服务端序列号区域合法,需要检查。
客户端在TCP 报头的序列号区中插入自己的ISN。
服务端收到该TCP 分段后,在②、第二步以自己的ISN 回应(SYN 标志置位),同时确认收到客户端的第一个TCP 分段(ACK 标志置位)。
③、在第三步中,客户端确认收到服务端的ISN(ACK 标志置位)。
到此为止建立完整的TCP 连接,开始全双工模式的数据传输过程。
根据以上内容编写一个TCP Client/Server 模式的通信程序。
事实上网络程序是由两个部分组成的--客户端和服务器端。
它们的建立步骤如下:服务器端:socket-->bind-->listen-->accept客户端:socket-->connect。
三、实验步骤实验按下述步骤进行:(1)编写UDP、TCP Client/Server模式的通信程序;(2)调试并运行自己编写的实现程序;(3)了解TCP Client/Server模式的工作原理,比较二者的不同,如出现异常情况,在实验报告中写出原因分析;(4)保留编写的实现程序在你的用户目录下,以备辅导教师检查。
UDP实验报告
目录课题要求 (2)1.本课题的目的 (2)2.运行环境 (2)正文 (2)一.课题分析 (2)二.系统设计 (2)2.1 实验原理简介 (2)2.2 硬件设计 (3)2.3 软件设计 (4)三.技术实现问题 (7)四.总结与体会 (8)设计性实验报告成绩:指导教师签名: (9)课题要求1.本课题的目的1.学习UDP的通讯原理。
2.掌握Socket的编程方法。
3.培养学生自己的创新实验的能力。
2.运行环境硬件:ARM 嵌入式开发平台、用于 ARM7TDMI 的 JTAG 仿真器、PC 机Pentium100 以上、交叉序网线。
软件:PC 机操作系统 win98、Win2000 或 WinXP、ARM SDT 2.51 或者是ADS1.2 集成开发环境、仿真器驱动程序、超级终端通讯程序。
正文一.课题分析可以利用编程实现嵌入式开发平台和计算机之间的UDP通讯。
通过在触摸屏上画图,使其在液晶屏上显示,同时通过网络传输数据,使其在计算机屏幕上显示;由计算机控制清除液晶屏上的图形。
在此基础上,通过小键盘控制在触摸屏上绘画的图形,如按键后控制绘矩形或圆形等,通过双击清屏等功能。
二.系统设计2.1 实验原理简介2.1.1UDP协议简介UDP协议是英文User Datagram Protocol的缩写,即用户数据报协议,主要用来支持那些需要在计算机之间传输数据的网络应用。
包括网络视频会议系统在内的众多客户/ 服务器模式的网络应用都需要使用UDP协议。
UDP协议的主要作用是将网络数据流压缩成数据报的形式。
一个典型的数据报就是一个二进制数据的传输单位。
每一个数据报的前8个字节用来包含报头信息,剩余字节则用来包含具体的传输数据。
UDP报头由4个域组成,其中每个域各占用2个字节,具体如下图1所示:图1用户数据报格式2.1.2 SOCKET简介Socket接口是TCP/IP网络的API,Socket接口定义了许多函数或例程。
通信系统实验报告
通信系统实验报告一、实验目的本次实验的目的是通过搭建一个简单的通信系统来了解通信系统的基本原理和组成部分。
二、实验原理通信系统主要由发送器、信道和接收器三部分组成。
发送器将输入信息转换为适合传输和存储的信号,信道负责信号的传输和存储,接收器将信号转换为可读的信息。
在本次实验中,我们将通过UDP协议进行信息的传输。
三、实验步骤1.设计发送器:通过编程设计一个发送器,将输入的信息转换为UDP 协议可识别的数据包,并通过网络传输给接收器。
2.设计接收器:编写接收器程序,接收从发送器发送的数据包,并将数据包中的信息提取出来并展示在屏幕上。
3.进行通信测试:在本地搭建一个局域网,将发送器和接收器连接在同一个局域网中,进行通信测试。
四、实验结果通过搭建实验系统并进行测试,我们成功实现了信息的发送和接收功能。
在发送器中输入的信息能够被接收器准确地展示在屏幕上。
五、实验总结通过本次实验,我们了解到通信系统的基本原理和组成部分,掌握了UDP协议的使用方法,提高了对网络通信的理解。
同时,我们还对发送器和接收器进行了设计和编程,提升了我们的编程能力。
在今后的学习和工作中,这些知识和技能都将对我们有很大的帮助。
六、实验感想通过本次实验,我对通信系统有了更深入的了解。
在过程中,我遇到了一些问题和困难,但通过不断地思考和尝试,最终成功解决了这些问题,并完成了实验。
这个过程让我更加深刻地认识到,只有不断地学习和实践,才能更好地掌握知识和技能,提升自己的能力。
七、实验改进虽然我们在本次实验中取得了较好的结果,但仍然有一些不足之处。
例如,我们的通信系统仅支持文本信息的传输,无法传输其他类型的文件和数据。
在今后的研究中,我们可以尝试改进系统,使其能够支持更多类型的信息传输和处理。
另外,我们也可以进一步优化系统的性能和稳定性,提升系统的实用性。
总之,通过本次实验,我们不仅学习到了理论知识,还锻炼了实践技能,提高了自己的能力。
这将对我们今后的学习和工作产生积极的影响。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
UDP通信实验
一、实验目的
1.进一步理解Winsock编程接口的调用方法。
2.了解UDP协议的工作原理,掌握UDP服务端程序和客户端程序的编写过程,熟悉程序的测试方法。
二、实验过程
1.调试实验带的代码,使之能运行。
2.修改代码使服务端和客户端能互发信息,并能正确接受到。
3.进一步修改代码,当任何一方发送字符“bye”程序就结束
三、实验代码
(1)UDPServer
#include<iostream.h>
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"WS2_32")
class CInitSock
{
public:
CInitSock(BYTE minorVer=2,BYTE majorVer=2)
{
WSADATA wsaData;
WORD sockVersion=MAKEWORD(minorVer,majorVer);
if(::WSAStartup(sockVersion,&wsaData)!=0)
{
exit(0);
}
}
~CInitSock()
{
::WSACleanup();
}
};
CInitSock initSock; // 初始化Winsock库
int main()
{
// 创建套节字
SOCKET s = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(s == INVALID_SOCKET)
{
printf("Failed socket() \n");
return 0;
}
// 填充sockaddr_in结构
sockaddr_in sin;
sin.sin_family = AF_INET;
sin.sin_port = htons(4567);
sin.sin_addr.S_un.S_addr = INADDR_ANY;
// 绑定这个套节字到一个本地地址
if(::bind(s, (LPSOCKADDR)&sin, sizeof(sin)) == SOCKET_ERROR)
{
printf("Failed bind() \n");
return 0;
}
// 接收数据
char buff[1024];
sockaddr_in addr;
int nLen = sizeof(addr);
while(TRUE)
{
int nRecv = ::recvfrom(s, buff, 1024, 0, (sockaddr*)&addr, &nLen);
if(nRecv > 0)
{
buff[nRecv] = '\0';
printf(" 接收到数据(%s):%s", ::inet_ntoa(addr.sin_addr), buff);
if(strcmp(buff,"bye")==0)
break;
char szText[1024] ;
cin>>szText;
::sendto(s, szText, strlen(szText), 0, (sockaddr*)&addr, sizeof(addr));
}
}
printf("\n");
::closesocket(s);
(2)UDPClient
#include<iostream.h>
#include <winsock2.h>
#include <stdio.h>
#pragma comment(lib,"WS2_32")
class CInitSock
{
public:
CInitSock(BYTE minorVer=2,BYTE majorVer=2)
{
WSADATA wsaData;
WORD sockVersion=MAKEWORD(minorVer,majorVer);
if(::WSAStartup(sockVersion,&wsaData)!=0)
{
exit(0);
}
}
~CInitSock()
{
::WSACleanup();
}
};
CInitSock initSock; // 初始化Winsock库
int main()
{
// 创建套节字
SOCKET s = ::socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);
if(s == INVALID_SOCKET)
{
printf("Failed socket() %d \n", ::WSAGetLastError());
return 0;
}
// 也可以在这里调用bind函数绑定一个本地地址
// 否则系统将会自动安排
// 填写远程地址信息
sockaddr_in addr;
addr.sin_family = AF_INET;
addr.sin_port = htons(4567);
// 注意,这里要填写服务器程序所在机器的IP地址
// 如果你的计算机没有联网,直接使用.0.0.1即可
addr.sin_addr.S_un.S_addr = inet_addr("127.0.0.1");
// 发送数据
// char szText[] = "ha";
//::sendto(s, szText, strlen(szText), 0, (sockaddr*)&addr, sizeof(addr));
// 接收数据
char buff[1024];
//sockaddr_in addr;
int nLen = sizeof(addr);
while(TRUE)
{
// 发送数据
char szText[1024] ;
cin>>szText;
::sendto(s, szText, strlen(szText), 0, (sockaddr*)&addr, sizeof(addr));
int nRecv = ::recvfrom(s, buff, 1024, 0, (sockaddr*)&addr, &nLen);
if(nRecv > 0)
{
buff[nRecv] = '\0';
printf(" 接收到数据(%s):%s", ::inet_ntoa(addr.sin_addr), buff);
}
if(strcmp(buff,"bye")==0)
break;
}
printf("\n");
::closesocket(s);
return 0;
}
四、实验结果
UDPServer
UDPClient
五、实验总结
这次实验比较简单,运行的时候要先运行服务端,再运行客户端。
按照实验要求当任何一方发送字符“bye”程序就结束,因此服务端在接受数据函数后加上字符比较函数strcmp (),客户端也同样处理。
实验结束基本上理解UDP通信的过程。