关于套接字编程的文件传输的问题

时间:2009-11-23 05:49:44

标签: c++ networking file-upload sockets

对于如何将文件从...客户端传输到服务器,有没有一个很好的方法? 可能只是图像,但我的教授要求任何类型的文件。

我环顾四周,对一般的想法感到有些困惑。

因此,如果我们有一个大文件,我们可以将该文件拆分成段......?然后将每个段发送到服务器。

我是否还应该使用while循环来接收服务器端的所有文件/段?另外,我的服务器如何知道是否收到了所有段而没有事先知道有多少段?

我正在寻找Cplusplus网站,发现有类似文件的二进制传输......

感谢所有帮助=)

3 个答案:

答案 0 :(得分:2)

如果使用基于UDP的传输协议,则必须将文件分解为用于网络传输的块。您还必须在接收端以正确的顺序重新组装它们并验证结果。如果您使用基于TCP的传输协议,所有这些都将在下面进行处理。

您应该咨询Beej's Guide to Network Programming,了解如何最好地发送和接收数据以及一般使用套接字。它解释了你要问的大部分事情。

答案 1 :(得分:2)

如果您使用TCP:

你是对的,没有办法“知道”你将收到多少数据。这为您提供了一些选择:

1)在传输图像数据之前,首先发送预期的字节数。所以你的前4个字节可能是4字节整数“4096”。然后你的客户端可以读取前4个字节,“知道”它预期4096字节,然后malloc(4096)所以它可以预期其余的。然后,您的服务器可以发送()4096字节的图像数据。

执行此操作时,请注意您可能需要多次recv() - 由于某种原因,您可能没有收到所有4096个字节。所以你需要检查recv()的返回值,以确保你已经得到了所有东西。

2)如果您只是发送一个文件,您可以让您的接收器读取它。并且它可以保持从套接字recv()直到服务器关闭连接。这有点难 - 你必须记录你收到了多少,然后如果你的缓冲区已满,你将不得不重新分配它。我不推荐这种方法,但它在技术上可以完成任务。

如果您使用的是UDP:

这意味着您没有可靠的转移。因此可能会丢弃数据包。它们也可能无序到达。因此,如果要使用UDP,则必须将数据分段为小段。发送方和接收方都必须就段的大小(100字节?1000字节?)

达成一致

不仅如此,您还必须为每个数据包传输一个序列号 - 即标记每个数据包#1,#2等。因为您的客户端必须能够告知:是否有任何数据包丢失(您收到数据包1,2和4 - 因此缺少#3)并确保它们按顺序排列(您收到3,2,然后1 - 但是当您将它们保存到文件中时,您必须确保数据包保存在正确的顺序,1,2,然后3)。

因此,对于您的任务,它将取决于您必须/允许使用的协议。

答案 2 :(得分:0)

传输文件的方法有很多种。如果您在无损庄园中传输文件,那么您基本上将文件分成块。使用序列号标记每个块。将块发送到另一侧并重新构建文件。面向流的协议更简单,因为丢失时将重传数据包。如果您使用不可靠的协议,那么您将需要重新传输丢失的数据包和重新排序的块,这些数据块的顺序不正确。

如果有损转移是可接受的(如传输视频或在线游戏数据),则使用不可靠的协议。有损传输更简单,因为您不必重新传输丢失的块。您需要做的就是确保以正确的顺序处理块。

许多协议发送终结器数据包以指示传输结束。如果您不希望在传输之前将块数发送到另一侧,则可以使用此策略。