C试图在标题中找到\ r \ n \ r \ n

时间:2013-11-14 06:35:32

标签: c windows

我正在尝试找到\r\n\r\n的最后一次出现并删除它之前的所有内容(包括它)。我正在创建一个套接字并下载一个文件,然后该文件将被保存。 HTTP标头保存在文件中(根据十六进制编辑器\r\n\r\n确实存在)。但我似乎无法使用strstr找到它,根据MSDN recv返回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?

hex codes

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

2 个答案:

答案 0 :(得分:3)

啊,文本文件和标准I / O的奇迹。

当您在文本模式下打开文件时,更改了本机行结尾,以便程序看到的行只是\n作为行结束,即使磁盘上的内容不同。

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

  

ISO / IEC 9899:2011§7.21.2 Streams

     

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

答案 1 :(得分:1)

您可能需要处理标题标记的结尾可能出现在多个recv调用中的事实。服务器发送标头是合理的,每个标头都以\r\n结束,然后send\r\n为前缀的请求正文表示标头的结束并开始“正文”导致序列\r\n\r\nrecv次调用中被分割。