C - 如何逐行读取 HTTP GET 请求的返回值?
C - How can I read the returned values of a HTTP GET request line by line?
我的目标是在获取请求后读取返回的 http 状态代码(返回的第一行)。然后,如果状态代码为 200,则打印消息的其余部分,否则仅打印状态代码。我怎样才能做到这一点?
我当前的代码returns整个网页:
main(int argc, char *argv[])
{
int csd;
struct sockaddr_in server;
struct hostent *server_host;
int server_len;
int string_size;
short server_port;
char req_buffer[BUF_LEN];
char temp_buffer[BUF_LEN];
char receiveBuffer[BUF_LEN];
char resource_buffer[BUF_LEN];
int t;
int chars_read;
if(argc!=2)
{
fprintf(stderr,"Usage: %s <website> \n",argv[0]);
exit(EXIT_FAILURE);
}
server_host=gethostbyname(argv[1]);
if (server_host == NULL)
{
herror("While calling gethostbyname()");
exit(EXIT_FAILURE);
}
csd=socket(PF_INET, SOCK_STREAM, 0);
if(csd<0)
{
perror("While calling socket()");
exit(EXIT_FAILURE);
}
server.sin_family=AF_INET;
memcpy(&server.sin_addr, server_host->h_addr_list[0], server_host->h_length);
server.sin_port = htons(80);
server_len=sizeof(server);
t = connect(csd, (struct sockaddr *) &server, server_len);
if (t<0)
{
perror("while connecting()");
exit(EXIT_FAILURE);
}
else
{
printf("connected to server\n\n");
}
sprintf(temp_buffer, "GET / HTTP/1.0\r\n");
strcpy(req_buffer, temp_buffer);
sprintf(temp_buffer, "HOST: %s\r\n", argv[1]);
strcat(req_buffer, temp_buffer);
sprintf(temp_buffer, "\r\n");
strcat(req_buffer, temp_buffer);
printf(req_buffer);
write(csd, req_buffer, strlen(req_buffer));
while (1)
{
chars_read = read(csd, receiveBuffer, 10000);
if (chars_read == 0)
return;
fwrite (receiveBuffer, sizeof (receiveBuffer), chars_read, stdout);
}
close(csd);
}
此外,当我 运行 这时,我得到 2 个奇怪的输出。首先是以奇怪的格式放置的奇怪字母。其次是在我的新输入行的开头有一个很长的无形代码。像这样:([username@han ~Desktop]$(这里有很长很奇怪的代码))
如果 csd
是文件句柄而不是文件描述符,我建议使用 fgets
逐行处理输入流。
但这不是 :-)
所以你(至少)有几个选择。
首先,您可以逐个字符读取,将其添加到缓冲区,然后,当您读取换行符时,将所述缓冲区传递给函数以在将缓冲区清零并继续之前处理整行。
或者您可以读取整条消息并 post 以类似的方式对其进行处理,查找嵌入的换行符并将相关部分(即一行)传递给函数进行处理。
就你狡猾的性格而言,这可能是由很多原因造成的,但我会注意(同样,至少):
printf
带有不受控制的字符串。正确的做法是 printf("%s", dodgyString)
以确保字符串中的任何 %
个字符不会引起问题。
- 创建大小为
BUF_LEN
的缓冲区,然后使用 10000
作为其限制。你真的应该使用 BUF_LEN
作为限制。
-
fwrite
的参数。您应该使用 1
的单位大小和 chars_read
的单位计数,或者相反。当你只阅读 chars_read
时写 BUF_LEN * chars_read
个字符会给你带来麻烦。
我的目标是在获取请求后读取返回的 http 状态代码(返回的第一行)。然后,如果状态代码为 200,则打印消息的其余部分,否则仅打印状态代码。我怎样才能做到这一点?
我当前的代码returns整个网页:
main(int argc, char *argv[])
{
int csd;
struct sockaddr_in server;
struct hostent *server_host;
int server_len;
int string_size;
short server_port;
char req_buffer[BUF_LEN];
char temp_buffer[BUF_LEN];
char receiveBuffer[BUF_LEN];
char resource_buffer[BUF_LEN];
int t;
int chars_read;
if(argc!=2)
{
fprintf(stderr,"Usage: %s <website> \n",argv[0]);
exit(EXIT_FAILURE);
}
server_host=gethostbyname(argv[1]);
if (server_host == NULL)
{
herror("While calling gethostbyname()");
exit(EXIT_FAILURE);
}
csd=socket(PF_INET, SOCK_STREAM, 0);
if(csd<0)
{
perror("While calling socket()");
exit(EXIT_FAILURE);
}
server.sin_family=AF_INET;
memcpy(&server.sin_addr, server_host->h_addr_list[0], server_host->h_length);
server.sin_port = htons(80);
server_len=sizeof(server);
t = connect(csd, (struct sockaddr *) &server, server_len);
if (t<0)
{
perror("while connecting()");
exit(EXIT_FAILURE);
}
else
{
printf("connected to server\n\n");
}
sprintf(temp_buffer, "GET / HTTP/1.0\r\n");
strcpy(req_buffer, temp_buffer);
sprintf(temp_buffer, "HOST: %s\r\n", argv[1]);
strcat(req_buffer, temp_buffer);
sprintf(temp_buffer, "\r\n");
strcat(req_buffer, temp_buffer);
printf(req_buffer);
write(csd, req_buffer, strlen(req_buffer));
while (1)
{
chars_read = read(csd, receiveBuffer, 10000);
if (chars_read == 0)
return;
fwrite (receiveBuffer, sizeof (receiveBuffer), chars_read, stdout);
}
close(csd);
}
此外,当我 运行 这时,我得到 2 个奇怪的输出。首先是以奇怪的格式放置的奇怪字母。其次是在我的新输入行的开头有一个很长的无形代码。像这样:([username@han ~Desktop]$(这里有很长很奇怪的代码))
如果 csd
是文件句柄而不是文件描述符,我建议使用 fgets
逐行处理输入流。
但这不是 :-)
所以你(至少)有几个选择。
首先,您可以逐个字符读取,将其添加到缓冲区,然后,当您读取换行符时,将所述缓冲区传递给函数以在将缓冲区清零并继续之前处理整行。
或者您可以读取整条消息并 post 以类似的方式对其进行处理,查找嵌入的换行符并将相关部分(即一行)传递给函数进行处理。
就你狡猾的性格而言,这可能是由很多原因造成的,但我会注意(同样,至少):
printf
带有不受控制的字符串。正确的做法是printf("%s", dodgyString)
以确保字符串中的任何%
个字符不会引起问题。- 创建大小为
BUF_LEN
的缓冲区,然后使用10000
作为其限制。你真的应该使用BUF_LEN
作为限制。 -
fwrite
的参数。您应该使用1
的单位大小和chars_read
的单位计数,或者相反。当你只阅读chars_read
时写BUF_LEN * chars_read
个字符会给你带来麻烦。