gpt4 book ai didi

C 读取页面的 HTML

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

我是网络编程的新手。所以我正在开发一个将类似这样的东西传递给套接字的程序:

GET /index.html HTTP/1.1\r\n // index.html is the site being read from
Host: www.google.com\r\n // host can be anything
\r\n

请注意,/index.html 和 google.com 只是示例。我的程序用命令行输入替换了这些。

所以我将 GET 消息存储在一个字符串中,然后使用 send() 方法将请求发送到服务器。我检查了 errno,它返回 "Success"

不对,我被卡住了,不知道下一步该怎么做才能阅读 HTML。我认为 RIO 库会帮助我解决这个问题,但我不知道如何实现后续步骤。

这是我目前所拥有的:

int open_clientfd(char *hostname, int port)
{
int clientfd;
struct hostent *hp;
struct sockaddr_in serveraddr;

if ((clientfd = socket(AF_INET, SOCK_STREAM, 0)) < 0)
return -1; /* Check errno for cause of error */

/* Fill in the server's IP address and port */
if ((hp = gethostbyname(hostname)) == NULL)
return -2; /* Check h_errno for cause of error */
bzero((char *) &serveraddr, sizeof(serveraddr));
serveraddr.sin_family = AF_INET;
bcopy((char *)hp->h_addr_list[0],
(char
*)&serveraddr.sin_addr.s_addr,
hp->h_length);
serveraddr.sin_port = htons(port);

/* Establish a connection with
* the server */
if (connect(clientfd, (SA *)
&serveraddr,
sizeof(serveraddr)) < 0)
return -1;
return clientfd;
}

void sendRequest(int clientfd, char request[128]) {
send(clientfd, request, sizeof(request), 0);
fprintf(stderr, "%s\n", strerror(errno)); // return SUCCESS
}

int main(int argc, char **argv) {
int clientfd, port;
char *host, *fileURL, buf[MAXLINE];

rio_t rio;

host = argv[1];
fileURL = argv[2];

port = atoi(argv[3]);

clientfd = Open_clientfd(host, port);

// set up request string
char request[128];

// ....

// now request stores the string above

sendRequest(clientfd, request);
}

最佳答案

下一步调用recv或read

ssize_t recv(int sockfd, void *buf, size_t len, int flags);
ssize_t read(int fd, void *buf, size_t count);

但是你必须考虑到TCP是一个面向流的协议(protocol)。因此,响应可能会在一个或多个 TCP 消息中返回。您不能假设它会是一个并且您不知道响应的大小。 read/recv 的返回可能不会带来整个 HTTP 消息。然后你必须阅读直到到达 HTTP header “\r\n\r\n”的末尾。之后,您必须解析目前获得的响应并找到 header Content-Length,获取内容长度,它将为您提供 HTTP 数据的大小。然后从数据的开头读取 Content-Length Bytes。

关于C 读取页面的 HTML,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31889109/

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