我得到了一个带有 HTTP 请求内容的字符串流。如您所知,HTTP 请求以 CRLF 中断告终。但是 operator>> 不会将 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”是代表实际的请求结束还是只是一个我需要阅读更多内容的中断词完成请求。
最佳答案
首先, peek
返回 int
,而不是 char
(至少, std::istream::peek
返回 int
——我不知道 boost )。这种区别对于将 -1 识别为文件结尾而不是具有 0xFF
值的字符很重要。
另请注意,文本模式下的 i/o 流会将平台的行分隔符转换为 '\n'
(在 C 和 C++ 中为 usually has the same value as a line feed, but it might not )。因此,如果您在 Windows 上运行它,其中 native 行分隔符是 CR+LF,您将永远看不到 CR。但是,如果您在 Linux 机器上运行相同的代码,其中 native 分隔符只是 LF,您会的。
所以鉴于你的问题:
答案是以二进制模式打开流并检查 0x0D
后跟 0x0A
的字符值。
也就是说,HTML 代码忽略网络协议(protocol)需要 CR+LF 并非闻所未闻。如果您想遵守“接受的东西要自由”的格言,您只需注意 CR 或 LF,然后跳过下一个字符(如果它是补码)。
关于c++ - 如何检测流中的 CRLF,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/22270005/