2009-11-23 205 views
0

有没有一种很好的方法可以将文件从客户端传输到服务器? 可能只是图像,但我的教授要求任何类型的文件。有关套接字编程的文件传输问题

我环顾四周,对于总体思路有点困惑。

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

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

我一直在寻找的CPLUSPLUS网站上,发现有一个像文件的二进制传输...

感谢所有帮助=)

回答

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

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

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

0

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

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

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