Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
调用recv()函数时接收多个html内容?_C_Sockets_Get - Fatal编程技术网

调用recv()函数时接收多个html内容?

调用recv()函数时接收多个html内容?,c,sockets,get,C,Sockets,Get,我正在编写一个http客户端来从网站接收html 这就是代码:我只是添加了一段代码,其中包含与套接字相关的逻辑,因此缺少字符串(char[])和函数的初始化 在接收html时,我得到了多个html内容,在html代码完成后,我再次得到了相同html的某些部分,但大部分内容都不完整,似乎服务器正在发送多个文件 大概是这样的: <!-- header --> <html> something </html> <!-- header --> <ht

我正在编写一个http客户端来从网站接收html

这就是代码:我只是添加了一段代码,其中包含与套接字相关的逻辑,因此缺少字符串(char[])和函数的初始化

在接收html时,我得到了多个html内容,在html代码完成后,我再次得到了相同html的某些部分,但大部分内容都不完整,似乎服务器正在发送多个文件

大概是这样的:

<!-- header -->
<html> something </html>
<!-- header -->
<html> someth

某物
某些
我认为这是由于连续调用
recv()
函数来获取所需的所有数据。正如您所看到的,我在while循环中设置了一个条件,当数据到达末尾时自动停止接收数据,但不会停止

我不知道这是否是预期的,我必须设置一些其他逻辑来停止对
recv()
的更多调用,如果是,那么是什么逻辑。 是不是我必须写一些东西来格式化数据,使其只包含一个html正文,就像在找到
标记后删除所有内容一样


到目前为止,我找到的所有帖子都解释说,预期不会一次收到所有数据,因此我不得不多次调用
recv()
。但它们似乎没有说要接收多个html正文并编写一些逻辑来停止。

TCP是一种基于流的协议,这意味着一次读取可以对应多条消息或部分消息


您需要读取内容长度标题,以了解应该读取多少字节。如果你碰巧得到了比你要求的更多的字节,你需要缓冲这些字节,并将它们保存到你阅读的下一封邮件中。

你能解释一下我如何读取内容长度标题吗?我想有时这些内容长度标题也不见了(如果我错了,我不确定是否更正)。@shobhit阅读后,在缓冲区中搜索“内容长度”使用
strstr
。如果标题不在那里,则查找标题的结尾(一个双换行符)并阅读直到看到
。好的,您的意思是我得到的结果是预期的,我必须编辑我的文件(输出)以使用我想要的内容。@shobhit Correct
<!-- header -->
<html> something </html>
<!-- header -->
<html> someth