2 zwfgogo ZWFGOGO 于 2015.07.17 00:18 提问

设计tftp服务器和客户端 5C

要求tftp服务器端支持多用户的请求(客户端上传、下载),使用select完成并发,
不能用多线程。采用UDP C 语言

5个回答

CSDNXIAON
CSDNXIAON   2015.07.17 00:21

服务器设计和客户端设计的感悟
----------------------同志你好,我是CSDN问答机器人小N,奉组织之命为你提供参考答案,编程尚未成功,同志仍需努力!

caozhy
caozhy   Ds   Rxr 2015.07.17 03:26
oyljerry
oyljerry   Ds   Rxr 2015.07.17 07:53

不用多线程,那就是主线程中select等待,然后来了请求就转给处理函数处理对应的动作。udp的recvfrom等接收数据

zuishikonghuan
zuishikonghuan   2015.07.17 22:43

这个首先学会相关的协议,然后就是socket了,而你又用的select这种模型,因此开发并不难。
但是用udp开发,,说实话,udp是非连接不可靠的网络协议,那么文件上传下载的完整性和可靠性无法被协议保证,需要应用程序开发人员自行解决,这相当于又写了一遍TCP的校验,超时,重发机制,,

lpfly
lpfly   2015.07.22 04:39

我用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.

Csdn user default icon
上传中...
上传图片
插入图片