gpt4 book ai didi

c++ - 如何检测流中的 CRLF

转载 作者:太空狗 更新时间:2023-10-29 23:16:44 25 4
gpt4 key购买 nike

我得到了一个带有 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 上运行它,本地行分隔符是 CR+LF,您将永远看不到 CR。但是,如果您在 Linux 机器上运行相同的代码,其中的 native 分隔符只是 LF,您会的。

鉴于您的问题:

How can I detect this CRLF break?

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

也就是说,HTML 代码忽略网络协议(protocol)需要 CR+LF 的情况并非闻所未闻。如果您想遵守“接受什么就自由”的格言,您只需观察 CR 或 LF,然后跳过下一个字符(如果它是补码)。

关于c++ - 如何检测流中的 CRLF,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22270005/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com