C:通过套接字发送和接收文件

时间:2013-05-03 18:21:04

标签: c file sockets network-programming

我正在尝试实现分布式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 /”

3 个答案:

答案 0 :(得分:1)

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

  

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

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

答案 1 :(得分: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);

答案 2 :(得分:0)

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

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