我正在尝试执行与python相同的C语言:
requests.get('http://test.com')
我首先使用getaddrinfo()
解析主机名(它有4个ips)到ip
然后server.sin_addr.s_addr = inet_addr(ip);
并且它成功连接(不会给出错误)。但是当我尝试通过发送"GET / HTTP/1.1\r\n\r\n
请求来显示页面时,它基本上会返回404错误(找不到页面)内容。这是功能:
void foo ()
{
struct addrinfo hints;
struct addrinfo *result = NULL;
ZeroMemory(&hints, sizeof(hints));
hints.ai_family = AF_UNSPEC;
hints.ai_socktype = SOCK_STREAM;
hints.ai_protocol = IPPROTO_TCP;
char host[256], port [256];
strcpy(host, "www.test.com");
strcpy(port, "80");
getaddrinfo(host, port, &hints, &result);
struct sockaddr_in *sockaddr_ipv4 = (struct sockaddr_in *)result->ai_addr;
char ip [256];
strcpy(ip, inet_ntoa(sockaddr_ipv4->sin_addr));
struct sockaddr_in server;
SOCKET s = socket(AF_INET , SOCK_STREAM , 0 );
char *message , server_reply[2000];
int recv_size;
server.sin_addr.s_addr = inet_addr(ip);
server.sin_family = AF_INET;
server.sin_port = htons( 80 );
if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0)
{
puts("connect error");
return 1;
}
message = "GET / HTTP/1.1\r\n\r\n";
if( send(s , message , strlen(message) , 0) < 0)
{
puts("Send failed");
return 1;
}
if((recv_size = recv(s , server_reply , 2000 , 0)) == SOCKET_ERROR)
{
puts("recv failed");
}
server_reply[recv_size] = '\0';
puts(server_reply);*/
system("PAUSE");
}
结果
HTTP / 1.1 404未找到日期:星期五,2017年9月15日03:19:41 GMT 内容类型:text / html; charset = UTF-8服务器:ghs内容长度: 1561 X-XSS-Protection:1; mode = block X-Frame-Options:SAMEORIGIN
错误404(未找到)!! 1
{margin:0; padding:0} html,代码{font:15px / 22px arial,sans-serif} html {backgrou nd:#fff;颜色:#222;填充:15px} body {margin:7%auto 0;最大宽度:390px;最小高度:180px;填充:30px 0 15px} &gt; body {background:url(// www.google.com/images/error s / robot.png)100% 5px no-repeat; padding-right:205px} p {margin:11px 0 22px; overflo w:hidden} ins {color:#777; text-decoration:none}一个img {border:0} @media 屏幕和(m AX-宽度:772px){体{背景:无;边距:0;最大宽度:无;填充右:0 }}#标志{背景:网址(// www.google.com/images/branding/googlelogo/1x/googlelogo _color_150x54dp.png)no-repeat; margin-left:-5px} @media only screen and(min-reso lution:192dpi){#标志{背景:网址(// www.google.com/images/branding/googlelogo/ 2x / googlelogo_color_150x54dp.png)无重复0%0%/ 100% 100%; - MOZ边界图像:UR 升(// www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 0}} @ media only screen and (-webkit敏设备像素比:2){#标志{背景:乌尔 升(// www.google.com/images/branding/googlelogo/2x/googlelogo_color_150x54dp.png) 不重复; -webkit-背景尺寸:100% 100%}} #logo {display:inline-block; height:5 4px; width:150px}404。 Thata?Ts错误。
请求的网址 在此服务器上找不到
/
。综合类?我们所有人 知道。
我做错了什么?我该如何处理?
答案 0 :(得分:3)
在HTTP / 1.1中,您需要指定Host
标头。在HTTP / 1.0中你没有。因此,您必须将其更改为:
GET / HTTP/1.0\r\n\r\n
或
GET / HTTP/1.1\r\n
Host: the.hostname.com\r\n\r\n
由于虚拟主机名变得如此普遍,因此进行了此更改。