以块为单位传输文件

时间:2009-10-28 16:35:34

标签: c unix sockets

在C(UNIX)中,如何使用套接字在多个块中传输和接收文件?

例如,如果我有一个 1234 字节的文件,并且块大小为500,我会转移:

  • 500字节,
  • 然后500字节,
  • 然后是234个字节

我尝试使用fseek,read,write,但是我无法正确使用逻辑。即使是很好的参考也会非常感激。

我的套接字例程是:

int readn(sd, chunk, bytesToRead);

int writen(sd, chunk, bytesToWrite);

4 个答案:

答案 0 :(得分:3)

如果您正在使用TCP,那么您需要做的就是发送数据块(我假设您有某种协议可以告诉您块中有多少字节,例如标题?)以及何时获得另一端的块只需将其写入您要写入的文件即可。 TCP将处理确保所有内容都按预期顺序到达,因此您应该能够一步一步地读取X字节中的文件并发送它们,然后在recv端,您只需回收数据并编写它到文件...请记住,您在套接字上发出的每个读取都可以返回1到“块大小”字节之间的任何位置,并且您的协议应该能够告诉您预期的数量,然后您应该循环直到您拥有实际上得到的字节数和你期望的一样多......

如果您正在使用UDP,那么事情会变得更有趣,因为您需要跟踪特定数据报所代表的块...

家庭作业问题?

答案 1 :(得分:1)

在我的头脑中(未编译,因此将其视为伪代码):

bytesRemaining = 1234;
chunkSize = 500;
offset = 0;
bytesWritten = 0;

while(bytesRemaining > 0)
  {
    if(bytesRemaining < chunkSize)
      bytesToWrite = bytesRemaining;
    else
      bytesToWrite = chunkSize;

    writen(sd, chunk+offset, bytesToWrite);
    offset += bytesToWrite;
    bytesRemaining -= bytesToWrite;
  }

或者如果writen()返回写入的字节数:

bytesRemaining = 1234;
chunkSize = 500;
offset = 0;
bytesWritten = 0;

while(bytesRemaining > 0)
  {
    if(bytesRemaining < chunkSize)
      bytesToWrite = bytesRemaining;
    else
      bytesToWrite = chunkSize;

    bytesWritten = writen(sd, chunk+offset, bytesToWrite);
    offset += bytesWritten;
    bytesRemaining -= bytesWritten;
  }

相同的逻辑可以应用于readn()情况。

答案 2 :(得分:0)

你有正确的想法。要做的主要是确保您的IO调用实际上按照您告诉他们的方式进行...这意味着检查他们的返回代码以确保他们写入或读取您预期的金额...此外,它看起来就像你已经包装了读写......也许你应该首先确保它们是完全正确的......

答案 3 :(得分:0)

读取只会获得当时实际缓冲的字节数或最大玩具指定的字节数。因此,如果您经常阅读,您将获得更小的块。如果这很重要(我不知道为什么会这样),你需要整理自己的二级缓冲区中的数据,直到你得到你期望的数字。

当然,您可以使用非常好的文件传输协议,例如FTP。