gpt4 book ai didi

c - 使用C套接字编程获取网页

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

我正在尝试用 C 构建代理服务器。我的问题如下,

我有一个 fetch_response() 函数,它连接到 example.com 并使用 HTTP GET 请求查询服务器。

int fetch_response() {
int sockfd, portno, n;
struct sockaddr_in serv_addr;
struct hostent *server;

char buffer[4096];
char *host = "example.com";

portno = 80;
sockfd = socket(AF_INET, SOCK_STREAM, 0);
if (sockfd < 0)
error("ERROR opening socket");
server = gethostbyname(host);
if (server == NULL) {
fprintf(stderr,"ERROR, no such host\n");
exit(0);
}
bzero((char *) &serv_addr, sizeof(serv_addr));
serv_addr.sin_family = AF_INET;
bcopy((char *)server->h_addr,
(char *)&serv_addr.sin_addr.s_addr,
server->h_length);
serv_addr.sin_port = htons(portno);
if (connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)) < 0) error("ERROR connecting");
const char * request = "GET / HTTP/1.0\r\nHost: example.com\r\nConnection: close\r\n\r\n";
n = write(sockfd,request,strlen(request));
if (n < 0) error("ERROR writing to socket");
bzero(buffer,4096);
n = read(sockfd,buffer,4095);
if (n < 0) error("ERROR reading from socket");
printf("%d\n", (int)strlen(buffer));
printf("%s\n",buffer);
close(sockfd);
return 0;
}

例如在测试时运行良好

int main() {
fetch_response();
return 0;
}

但是在我的代理服务器中我试图处理多个客户端请求,所以我的 main() 函数就像,

while(1) {
new_socket = accept(params);
if(new_socket < 0) error("Error on Connect");
pid = fork();
if(pid < 0) error("Error on fork");
if(pid == 0) {
fetch_response();
exit(0);
}
else close(new_socket);
}

在这种情况下,我遇到了一个问题。无论我的缓冲区大小是多少,我都只收到请求页面的前 1328 个字节。我用不同的域测试过,结果是一样的。例如,对于 example.com,预期结果是,

<html>
<head></head>
<body><h1> Example Domain </h1>
< Some remaining body here >
</body>
</html>

但是我得到了

<html>
<head></head>
<body><h1> Example Domain </h1>

我不明白为什么会这样。请帮忙。

谢谢!

PS:这不是代理服务器的实际代码。为了调试,我注释掉了所有内容并测试了上面的代码。

最佳答案

您需要将阅读代码包含在一个循环中,如下所示:

while (1) {
bzero(buffer,4096);
n = recv(sockfd,buffer,4095, 0);
if (n < 0) {
error("ERROR reading from socket");
break;
}
if (n == 0) {
// far end has closed socket
break;
}
// printf("%d\n", (int)strlen(buffer));
printf("%d\n", n);
printf("%s\n",buffer);
}

这将继续从套接字读取数据,直到远端关闭它。每次调用 recv 时,它都会返回缓冲区中的字节数。当它返回 0 时,远端已关闭套接字并且没有更多内容可读。

关于c - 使用C套接字编程获取网页,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33032893/

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