0

我正在尝试实现一个分布式 p2p 文件共享系统,其中一个对等方可以从其他对等方发送和下载文件。但是,我在下载文件并将其保存到目录时遇到了一些问题。

这是我发送请求文件的地方

while(!feof(requestedfile)) {
    bytes_read = fread(buf, 1, sizeof(buf), requestedfile);
    send(clientSock, buf, bytes_read, 0);

}

当我尝试下载时,我执行以下操作

while(recv(clientSock, currentLinePointer, 1, 0) != 0) {
    currentLinePointer++;
}

我是 C 新手,但我知道我有 2 个问题

  1. 如何执行更有效的读取?如果我一次读取 1024 个字节,在最后一个数据块处,可能只有 1024 个字节的一半被填充。其他 512 个无意义字节会导致我的文件出错吗?(我知道当您尝试读取并保存末尾带有无意义字节的 jpg 时,图片会发生不好的事情)
  2. 现在我已经阅读了文件,如何保存该文件?说一个对等请求“hello.jpg”。我的设置可以发送和读取该文件,但现在如何将该文件保存到请求的对等目录“PATH/Pictures/”
4

3 回答 3

1

http://msdn.microsoft.com/en-us/library/windows/desktop/ms740121(v=vs.85).aspx

如果没有发生错误,recv 返回接收到的字节数

您需要知道 recv 的返回值是什么,并且只将那个字节数写入您的文件。

于 2013-05-03T18:34:38.277 回答
0

recv()返回接收到的字节数,如果连接关闭则返回 0,错误时返回 -1。这基本上回答了你的问题。

您还应该跟踪send(). 它返回发送的字节数,或者最后放入缓冲区进行发送。如果缓冲区已满或连接丢失,它不会总是发送您告诉它的所有内容。跟踪其返回值以控制发送缓冲区的使用并避免正在传输的文件中出现间隙。您可能必须执行一个新send()调用来发送它在先前调用中拒绝发送的部分数据。

于 2013-05-03T18:54:12.883 回答
0

我建议您一次读取 4096 字节,因为这是当今磁盘扇区的标准大小(http://en.wikipedia.org/wiki/Disk_sector):

char* buffer = (char*)malloc(4096), *position = buffer;

while((bytes_read = recv(clientSock, position, 4096, 0) > 0)
{
    if(fwrite(position, 1, bytes_read, localFile) != bytes_read)
    {
        // do some error handling here
        break;
    }
    position += 4096;
}

// and here

free(buffer);
于 2013-05-03T18:44:18.663 回答