要求tftp服务器端支持多用户的请求(客户端上传、下载),使用select完成并发,
不能用多线程。采用UDP C 语言
http://www.pudn.com/downloads656/sourcecode/unix_linux/network/detail2665411.html
http://blog.csdn.net/memoryjs/article/details/7825502
不用多线程,那就是主线程中select等待,然后来了请求就转给处理函数处理对应的动作。udp的recvfrom等接收数据
这个首先学会相关的协议,然后就是socket了,而你又用的select这种模型,因此开发并不难。
但是用udp开发,,说实话,udp是非连接不可靠的网络协议,那么文件上传下载的完整性和可靠性无法被协议保证,需要应用程序开发人员自行解决,这相当于又写了一遍TCP的校验,超时,重发机制,,
我用Python写过一个简单的TFTP服务器,是Tribler项目(https://github.com/Tribler/tribler/)中的一部分,详细代码可以参照:https://github.com/Tribler/tribler/tree/devel/Tribler/Core/TFTP
由于我用的也是底层socket,所以原理上跟用C写是一样的。
TFTP是个很简单的协议,先看下IETF的文档,了解工作原理,主要有以下这些:
1、RFC 1350: The TFTP Protocol (Revision 20)
2、RFC 2347: TFTP Option Extension
3、RFC 2348: TFTP Blocksize Option
4、RFC 2349: TFTP Timeout Interval and Transfer Size Options
5、RFC 7440: TFTP Windowsize Option
主要思路就是设计一个loop,其中用select()来获得出入数据。个人觉得难点在于
(1) 对来自不同客户端的请求的判断。如果你要写标准的TFTP服务器,可以通过socket的IP和端口来判断这是属于谁的请求。在我的代码里我做了一些修改:我加了一个自动生成的session-id来判断一个请求是属于谁的请求。
(2) 对Timeout的判断。你还要判断是否和一个客户端的连接超时。
总的来说,你在那个loop里要做的就是:
1、select,获得可读的socket
2、处理这些可读socket的请求(判断是否是已建立的请求还是新的请求)
3、判断Timeout,释放timeout的请求的资源。
4、重复开始1.