如何在二进制模式下读取和发送CR / LF“x0D x0A”

时间:2013-05-26 15:12:34

标签: c++ winsock

我正在以二进制格式二进制格式打开PDF文件。我必须通过套接字将每个字节发送到服务器。我正在为此目的使用winsock。以下是我遇到问题的代码:

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 x0ACarriage Return & Line Feed的十六进制表示。

这是我的程序卡住的原因吗?我该如何解决这个问题?

1 个答案:

答案 0 :(得分:3)

如果您看到例如this reference您会看到get

  

3)与get(s, count, widen('\n'))相同,即读取最多count-1个字符并将它们存储到s指向的字符串中,直到找到'\ 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
}