我正在尝试找到\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?
它清楚地将0D0A0D0A写入文件,所以我不确定发生了什么。
答案 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\n
在recv
次调用中被分割。