如何检测流中的CRLF

时间:2014-03-08 13:32:58

标签: c++ iostream

我得到了一个包含HTTP请求内容的字符串流。如您所知,HTTP请求最终会导致CRLF中断。但是运营商>>不会识别CRLF,就好像它是正常的文件结尾一样。 如何检测此CRLF中断?

修改 好吧,实际上我正在使用boost.iostreams。但我不认为应该有任何分歧。

char head[]     = "GET / HTTP1.1\r\nConnection: close\r\nUser-Agent: Wget/1.12 (linux-gnu)\r\nHost: www.baidu.com\r\n\r\n";
io::stream<My_InOut>    in(head, sizeof head);
string s;
while(in >> s){
        char c = in.peek(); // what I am doing here is to check if next character is a normal break so that 's' is a complete word.
        switch( c ){
        case -1:
              // is it eof or an incomplete word?
              break;
        case 0x20: // a complete word
              break;
        case 0x0d:
        case 0x0a: // also known as \r\n should indicate a complete word
              break;
}

在这段代码中,我假设请求可能由于其传输而被拆分为部分,因此我想要识别'-1'是代表实际的请求结束还是仅仅是我需要的中断单词阅读更多内容以完成请求。

1 个答案:

答案 0 :(得分:0)

首先,peek返回int,而不是char(至少std::istream::peek返回int - 我不知道促进)。这种区别对于将-1识别为文件的结尾而不是值为0xFF的字符非常重要。

另请注意,文本模式下的i / o流会将平台的行分隔符转换为'\n'(在C和C ++中,usually has the same value as a line feed, but it might not)。因此,如果您在Windows上运行此操作,其中本机行分隔符为CR + LF,您将永远不会看到CR。但是如果你在Linux机器上运行相同的代码,原生分隔符只是LF,那么你就可以了。

所以给出你的问题:

  

如何检测此CRLF中断?

答案是以二进制模式打开流并检查字符值0x0D后跟0x0A

也就是说,HTML代码忽略网络协议需要CR + LF并不是闻所未闻。如果你想要遵守“你接受的自由”格言,你只需要注意CR或LF,然后跳过下一个字符,如果它是补充。