一、目标
基于UDP来设计一个文件传输的小工具,以此来了解UDP协议的特点。
内容:
基本要求:
输入对方IP地址,对方如果存在,可以给对方发送文件。
扩展要求:
(1)工具具有友好的用户界面;
(2)局域网内使用该工具的两台主机可以互相进行文字通信;
(3)自动按照一定频率扫描局域网内其他开启了该工具的主机,并在界面上用列表显示出来;
(4)传输文件和文字内容时,直接选择界面上已经显示出来的存活主机,不需要手动输入IP地址。
二、设计实现
环境:
Ubuntu14.04+Gcc4.8+Eclipse
关键环节:
1. 用户点对点通信,通信内容为文本消息和文件传输,利用ip服务器来记录上线的用户,用户上线下线都自动通知配置的IP服务器,同时用户可以随时想IP服务器请求在线的所有用户。
2. 使用poll来实现IO复用,监听标准输入文件描述符的读写和通信套接字的读写。
3. 制定命令”msgs”,”file”,”list”,”q”等命令。
使用方法:
msgs ip port message,代表向指定ip的端口发送文本消息message。
file ip port filepath, 代表向指定ip的端口传输文本filepath。
list,代表向配置的IP服务器请求在线用户。
q,代表推出客户端。
4. 客户通信过程详解
在整个客户端的运行过程中,涉及到三种消息,分别是在线用户ip显示、文本消息发送与显示、文件的发送与存储。因此,我们在每个消息包上用一个字节来进行标记,用来区分ip列表消息、文本消息和文件传输。
同时,为了保证本件传输的完整性,我们在文件传输的时候,又在消息头上增加了一个文件头结构体,其中记录了文件名、文件大小和已发送大小。
三、程序效果
1. 启动IP服务器
2. 启动两个示例客户端,两个客户端之间、以及客户端与服务器之间,可以通过相应的msgs,file,list,q等命令进行通信。
实验成功传输文本消息、图片和视频等各类文件,大文件(两部大小为5G的电影)的传输速度大概为4M/s,由于局域网网络简单,不会丢包,数据包的顺序正确,所以保证了数据的完整性和正确性。
通过实验发现,当传输大文件时,若发送数据过快,会造成数据包的丢失,因此,我们在发送间隔5毫秒。
下面是客户端1:
客户端2:
Ip服务器:
文件传输效果图:
四、程序源码
:https://github.com/panzhengguang/Unix_Net_Programming/tree/master/UdpFileTrans