【发布时间】:2015-02-09 20:42:48
【问题描述】:
我正在创建一个基于命令行参数下载网页的 HTTP 客户端。它接受参数,查找域名以获取 IP 地址,创建套接字,连接到服务器并发送 GET 请求并等待回复。这一切都很好,但是当我使用缓冲区和 while 循环阅读我的回复时,我也收到了一些不可读的字符。如果您运行代码并查看 html,您会在页面上到处看到不可读的字符。
我的代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <sys/socket.h>
#include <netdb.h>
#include <arpa/inet.h>
int main(int argc, char *argv[])
{
int socket_desc, i, bytes_read;
char server_reply[1024], ip[100], request[100];;
char *hostname = argv[1];
struct sockaddr_in server;
struct hostent *he;
struct in_addr **addr_list;
FILE *fp;
if ((he = gethostbyname(hostname)) == NULL) {
//gethostbyname failed
herror("gethostbyname\n");
return 1;
}
addr_list = (struct in_addr **) he->h_addr_list;
for(i = 0; addr_list[i] != NULL; i++) {
//Return the first one;
strcpy(ip , inet_ntoa(*addr_list[i]) );
}
//Create socket
socket_desc = socket(AF_INET, SOCK_STREAM, 0);
if (socket_desc == -1) {
printf("Could not create socket!\n");
}
server.sin_addr.s_addr = inet_addr(ip);
server.sin_family = AF_INET;
server.sin_port = htons(80);
//Connect to remote server
if (connect(socket_desc , (struct sockaddr *)&server , sizeof(server)) < 0) {
printf("connect error!\n");
return 1;
}
printf("Connected...\n");
//Send some data
snprintf(request, 99, "GET / HTTP/1.1\r\n"
"Host: %s\r\n"
"\r\n\r\n", hostname
);
if (send(socket_desc, request, strlen(request), 0) < 0) {
puts("Send failed!\n");
return 1;
}
puts("Data Sent...\n");
//Receive a reply from the server
fp = fopen("/home/localusr/Desktop/ouput.html", "w+");
while (bytes_read = read(socket_desc, server_reply, sizeof(server_reply)) > 0) {
fputs(server_reply, fp);
memset(server_reply, 0, sizeof(server_reply));
}
do {
bytes_read = read(socket_desc, server_reply, sizeof(server_reply));
fputs(server_reply, fp);
memset(server_reply, 0, sizeof(server_reply));
} while (bytes_read > 0);
printf("reply received...\n");
fclose(fp);
close(socket_desc);
return 0;
}
抱歉,缩进不佳的代码。非常感谢任何帮助。我正在使用 Ubuntu 机器并使用 gcc 来编译我的代码。
编辑:
orb.ws.require.lib--> <script type="text/javascript">/*
be2
be2 不应该在那里。 * 也得到'@'符号
【问题讨论】:
-
请不要在未阅读必要文档的情况下尝试自己执行 HTTP。您在这里做错了几件事,这表明您不知道正确的 HTTP。
-
我已阅读 RFC 2616,我的 GET 请求符合标准,这没有问题。服务器回复 200 OK 并给我 html。它只是我的缓冲区,不断添加它未读取的字符。您的评论非常无益,实际上表明您对 GET 请求知之甚少。我不能使用 wget,因为我正在尝试用 C 自己制作程序,而没有使用许多可以为我完成它的库。
-
@WilliamGoodwin:Steffen 的评论很到位。您对 HTTP 的工作原理没有很好的理解,而您的代码反映了这一点。您的请求中有 1 个过多的 CRLF,并且在读取失败之前盲目读取入站数据的读取循环是读取服务器响应的完全错误的方式。你显然错过了RFC 2616 Section 4.4。您必须分析响应标头以了解如何正确读取响应正文。请参阅 stackoverflow.com/a/19211701/65863 了解您必须实施的逻辑示例。
标签: c sockets http buffer webpage