2013-05-26 40 views
1

我正在阅读PDF文件,以二进制格式打开它。我必须通过套接字将每个字节发送到服务器。我为此使用了winsock。以下就是我有问题的代码:如何在二进制模式下读取并发送CR/LF“x0D x0A”

int Div = (int)file_size/1024; 
int Mod = (int)file_size % 1024; 
for (int i=0; i<Div; i++) 
{ 
    file_block = new char[1024]; 
    myfile.seekg(i*1024); 
    myfile.get(file_block,1024); 
    send(theSocket,file_block,1024,0); 
} 
if (Mod != 0) 
{ 
    file_block = new char[Mod]; 
    myfile.seekg(Div*1024); 
    myfile.get(file_block,Mod); 
    send(theSocket,file_block,Mod,0); 
} 

当我阅读PDF文件,我的程序读取前4个字节后卡住,即%PDF-1.5。查看十六进制编辑器中的文件显示有x0D x0A这是Carriage Return & Line Feed的十六进制表示。

这是由于我的程序卡住了原因。我怎么解决这个问题 ?

+3

你有一个大的内存泄漏,因为你在每个循环中分配内存,但从不释放内存。 –

+0

请确保您在**连接的**两端以二进制模式打开文件 –

+0

缺少重要的代码,您不清楚如何打开文件。一定要使用ios :: binary,这样就不会像文本文件那样处理。 –

回答

3

如果您看到例如this reference你会看到get作用:

3)相同get(s, count, widen('\n')),也就是说,读最多算1个字符,并将其存储到字符串直到“\ n”发现指向秒。

所以开始它只会阅读,直到换行。它只会读取count - 1字符,在您的情况下1023而不是1024像您期望的那样。

您应该使用read代替:

myfile.read(file_block, 1024); 

你或许应该检查错误,以及,只发送,如果有没有:

if (myfile.read(file_block, 1024)) 
    send(theSocket, file_block, myfile.gcount(), 0); 
else 
{ 
    // Error, handle it somehow 
} 
+3

另外,'send()'可能只发送一部分缓冲区,所以需要额外的循环。 –