【发布时间】:2017-05-20 15:31:53
【问题描述】:
我知道要从 http 请求中跳过标头信息,您需要使用 \r\n 。我已经阅读了一堆关于这个问题的问题/主题,但没有对我有用的实现。为简单起见,我将使用没有相对路径的 URL(硬编码 GET 命令)。
我使用的 URL 是 elf.cs.pub.ro,我知道它的 IP 地址是 141.85.227.116。这个示例的超级简化代码如下:
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include <string.h>
#include <stdio.h>
#include <errno.h>
#define MAXLEN 500
void send_command(int sockfd, char sendbuf[], char * expected) {
char recvbuf[MAXLEN];
if(send(sockfd, sendbuf, strlen(sendbuf), 0) > 0) {
int data = recv(sockfd, recvbuf, MAXLEN - 1, 0);
printf("%s\n", recvbuf);
if(strstr(recvbuf, expected) == NULL) {
exit(0);
}
}
}
int main(int argc, char * * argv) {
int sockfd;
struct sockaddr_in servaddr;
char server_ip[20] = "141.85.227.116";
char sendbuf[MAXLEN];
char recvbuf[MAXLEN];
if ((sockfd = socket(AF_INET, SOCK_STREAM, 0)) < 0) {
printf("Socket creation error.\n");
exit(-1);
}
memset( & servaddr, 0, sizeof(servaddr));
servaddr.sin_family = AF_INET;
servaddr.sin_port = htons(80);
if (inet_aton(server_ip, & servaddr.sin_addr) <= 0) {
printf("Invalid IP\n");
exit(-1);
}
if (connect(sockfd, (struct sockaddr * ) & servaddr, sizeof(servaddr)) < 0) {
printf("Connection error\n");
exit(-1);
}
//If I use "GET / HTTP1.0\r\n" the connection never ends
//and same for "GET / HTTP1.0"...
sprintf(sendbuf,"GET / HTTP/1.0\r\n\r\n");
char expected[MAXLEN];
strcpy(expected, "2");
send_command(sockfd, sendbuf, expected);
memset(recvbuf, 0, strlen(recvbuf));
int n;
while ((n = recv(sockfd, recvbuf, MAXLEN - 1, 0)) > 0) {
printf("%s",recvbuf);
memset(recvbuf, 0, strlen(recvbuf));
}
close(sockfd);
return 0;
}
问题出在sprintf 我真的不知道为什么会出错,即使在阅读了 RFC 1945 和该站点的答案之后,我仍然不知道为什么标题没有得到打印...
L.E. : 为什么是负面的?我在问一个简单的问题,为此我提供了完整的测试代码 + 打印屏幕。
【问题讨论】:
-
我不确定您到底在期待什么。但是,如果我使用您未更改的程序并运行它,它会在标准输出中向我显示正确的 HTTP 响应(标题和正文),正如我在阅读代码时所期望的那样 - 请参阅 pastebin.com/H101CnWz。
-
@SamiKuhmonen 我正在使用该函数来比较 http 状态...如果它以 2 => SUCCESS 开头,否则 => PERMISSION DENIED
-
你不能像那样使用
strstr...它可以找到 any 字符2恰好在最初读取的值中,例如Content-Length: 42跨度> -
@AnttiHaapala 绝对是,我的代码更加不同......我不想复制粘贴整个内容。这个想法是一样的:)