基于UDP套接字的无速率文件传输

时间:2012-04-17 17:31:34

标签: multithreading sockets process udp

我是套接字编程的新手,我需要实现基于UDP的无速率文件传输系统来验证我的研究中的方案。这是我需要做的:

我希望服务器S将文件发送到一组对等体A,B,C ......等。该文件被分成多个数据包。开始时,对等体将向服务器发送请求消息以初始化传输。每当S收到来自客户端的请求时,它会无限制地传输编码数据包(如何通过我的设计进行编码,编码本身具有擦除纠正功能,这就是我可以通过UDP无偿传输的原因)到该客户端。客户端不断收集数据包并尝试解码它们。当它最终解码所有数据包并成功重新构造文件时,它会向服务器发送一条Stop消息,S将停止向该客户端发送。

Peers以异步方式请求文件(它们可能在不同时间请求文件)。并且服务器必须能够同时为多个对等服务。不同客户端的编码数据包是不同的(但它们都是从相同的集合源数据包编码)。

以下是我正在考虑实施的内容。我对unix网络编程没有多少经验,所以我想知道你是否可以帮助我评估它,看看它是否可行或有效。

  1. 我要将服务器实现为具有两个套接字端口的并发UDP服务器(根据UNP书籍类似于TFTP)。一种是接收控制消息,因为在我的上下文中它是用于请求和停止消息。服务器将为每个请求维护一个标志(最初= 1)。当它从客户端收到Stop消息时,该标志将被设置为0.

  2. 当服务器收到请求时,它将fork()一个使用第二个套接字和端口向客户端发送编码数据包的新进程。只要标志为1,服务器就会继续向客户端发送数据包。当它变为0时,发送结束。

  3. 客户端程序很容易。只需发送一个Request,recvfrom()服务器,逐步解码文件并最后发送一条Stop消息。

  4. 这种设计是否可行?我所关注的主要问题是:(1),通过分支多个进程是否有效?或者我应该使用线程? (2),如果我必须使用多个进程,子进程如何知道标志位?感谢您的评论。

2 个答案:

答案 0 :(得分:0)

使用UDB进行文件传输并不是最好的选择。服务器或客户端无法知道任何数据包是否已丢失,因此您只能知道在重建期间假设您有某种机制(如计数器)来检测丢失的数据包。然后很难仅仅请求其中一个丢失的数据包。最后,您将拥有一个可以执行TCP套接字的代码。所以我建议从TCP开始。

服务器的典型设计涉及一个侦听器线程,只要有新的客户端请求,就会产生一个工作线程。新线程将处理与该特定客户端的通信然后结束。您应该保持同时提供的客户端(线程)的限制。不要为每个客户端生成一个新进程 - 效率低且不需要,因为这样就无法获得线程无法实现的任何功能。

线程编程需要小心,所以不要偷工减料。否则你将很难找到并诊断出问题。

答案 1 :(得分:0)

使用UDP进行文件传输会很有趣:(

每条消息的结构/类应包含序列号和校验和。这应该使每个客户端能够在传输结束时检测并要求重传任何丢失的块。

UDP可能是一个巨大的赢家,在本地局域网上。您可以将整个文件UDP一次性地广播到所有客户端,然后最后逐个询问每个客户端哪些块丢失并发送它们。我希望卡巴斯基等会使用这样的方案来更新我所有的本地方框。

我在CANBUS网络上使用过这样的广播方案,其中有许多需要下载新图像的微控制器。软件升级需要几分钟而不是几小时。