我正在尝试实现分布式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个问题
答案 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()
调用,以便在之前的呼叫中发送其拒绝的部分数据。