2

我试图找到最后一次出现\r\n\r\n并删除它之前的所有内容(包括它)。我正在创建一个套接字并下载一个文件,然后该文件将被保存。HTTP 标头保存在文件中(并且根据十六进制编辑器\r\n\r\n确实存在)。但我似乎无法使用 找到它strstr,根据 MSDNrecv返回 char 所以它应该能够找到它?

    while ((tmpres = recv(sock, buf, BUFSIZ, 0)) > 0)
    {
char *p = strstr(buf, "\r\n\r\n");
printf("%s", p);
exit(1);
        if (fwrite(buf, 1, tmpres, fp) != tmpres) {
            printf("Error writing buffer");
            exit(1);
        }
    }

然而strstr返回null?

十六进制代码

它清楚地将 0D0A0D0A 写入文件,所以我不确定发生了什么。

4

2 回答 2

3

啊,文本文件和标准 I/O 的奇妙之处。

当您以文本模式打开文件时,本机行尾会发生变化,因此程序看到的内容\n与行尾一样,即使磁盘上的内容不同。

要查看\r\n行尾,您必须以二进制模式打开文件。

ISO/IEC 9899:2011 §7.21.2

¶2 文本流是组成行的有序字符序列,每行由零个或多个字符加上一个终止换行符组成。最后一行是否需要终止换行符是实现定义的。可能必须在输入和输出上添加、更改或删除字符,以符合在主机环境中表示文本的不同约定。因此,流中的字符与外部表示中的字符之间不需要一一对应。只有在以下情况下,从文本流中读取的数据必须与之前写入该流的数据相比较: 数据仅包含打印字符和控制字符水平制表符和换行符;空格字符前面没有换行符;最后一个字符是换行符。读入时是否出现在换行符之前立即写出的空格字符是实现定义的。

于 2013-11-14T06:57:53.240 回答
1

recv您可能需要处理标题标记的结尾可能出现在多个调用中的事实。服务器发送标头是合理的,每个标头都由请求的主体终止\r\n,然后send是请求的主体,以\r\n表示标头的结束和“主体”的开始,从而导致序列在调用中\r\n\r\n被拆分。recv

于 2013-11-14T07:17:08.587 回答