gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-04 03:14:49 25 4
gpt4 key购买 nike

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

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

scanf("%s",&URL);
int c_socket = socket(AF_INET, SOCK_STREAM, 0);

struct sockaddr_in urladdress;
urladdress.sin_family = AF_INET;
urladdress.sin_port = htons(PORT);
urladdress.sin_addr.s_addr = inet_addr(URL);

connect(c_socket, (struct sockaddr*) &urladdress, sizeof(urladdress));

char REQUEST[] = "GET / HTTP/1.1\r\n\r\n";
char response[512];
int size_recv,total_recv = 0;
std::string content = " ";
send(c_socket, REQUEST, sizeof(REQUEST), 0);

while((size_recv = recv(c_socket, response, sizeof(response), 0)) > 0 && content[content.length()]!='\n')
{
content += response;
memset(response ,0 , sizeof(response));
}
close(c_socket);
printf("%s",content.c_str());

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

像这样:

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

我认为这是由于对 recv() 的连续调用所致函数来获取所有需要的数据。如您所见,我已经在 while 循环中设置了条件,以便在数据到达末尾时自动停止接收数据,但它并没有停止。

我不知道它是否符合预期,我必须放置一些其他逻辑来停止对 recv() 的更多调用如果是,那么逻辑是什么。是不是我必须写一些东西来格式化数据,以便它只包含一个 html 主体,比如删除 </html> 之后的所有内容?找到标签。

到目前为止我找到的所有帖子都解释说预计不会立即收到所有数据所以我不得不调用 recv() multiple times.But they don't seem to say anything about receiving more than one html body and write some logic to stop.

最佳答案

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

您需要阅读 Content-Length header 以了解您应该读取多少字节。如果您碰巧获得了比您要求的更多的字节,则需要缓冲这些字节并保存它们以供您阅读的下一条消息。

关于c - 调用 recv() 函数时接收多个 html 内容?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52972990/

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