我正在尝试编写一个 C 代码,该代码向本地 IP 地址(在我的网络中)发出 HTTP GET
请求,该地址在端口 80 上运行网页。该请求应返回 index.html
.
该代码适用于具有 DNS 的真实 IP 的网站(我已经使用 www.olx.ro
及其 IP 进行了测试),但是当我尝试时输入本地 IP(即 10.74.4.10),我收到 400 Bad Request 响应..
这是代码:
#include <sys/socket.h>
#include <sys/types.h>
#include <netinet/in.h>
#include <netdb.h>
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <unistd.h>
#include <errno.h>
#include <arpa/inet.h>
int main(void)
{
int byte_count;
int sockfd = 0,n = 0;
char recvBuff[9000];
struct sockaddr_in serv_addr;
memset(recvBuff, '0' ,sizeof(recvBuff));
if((sockfd = socket(AF_INET, SOCK_STREAM, 0))< 0)
{
printf("\n Error : Could not create socket \n");
return 1;
}
else printf("Created socket successfully.\n");
printf("\n");
serv_addr.sin_family = AF_INET;
serv_addr.sin_port = htons(80);
serv_addr.sin_addr.s_addr = inet_addr("10.74.4.10");
if(connect(sockfd, (struct sockaddr *)&serv_addr, sizeof(serv_addr))<0)
{
printf("\n Error : Connect Failed \n");
return 1;
}
else printf("Connected successfully. \n ");
printf("\n \n");
char *header = "GET /index.html HTTP/1.0\r\nHost:10.74.4.10:80\r\n\r\n";
send(sockfd,header,strlen(header),0);
byte_count = recv(sockfd,recvBuff,sizeof(recvBuff),0);
printf("Received %d bytes of data in buf\n",byte_count);
printf("\n");
printf("%.*s",byte_count,recvBuff);
return 0;
}
如果我将 inet_addr("10.74.4.10")
更改为 inet_addr("2.16.128.73")
,并且 "GET/index.html HTTP/1.0\r\n主机:10.74.4.10:80\r\n\r\n"
到 "GET/index.html HTTP/1.0\r\n主机:www.olx.ro:80\r\n\r\n"
,那么代码将按预期工作。
另外,我想提一下我使用 Repl.it 作为 C 编译器。
编辑:我忘了提及,代码在 connect()
处停止。我尝试过使用bind()
,仍然不起作用。也许是因为我正在尝试使用无法获得 root 访问权限的在线 C 编译器连接到特权端口 (80)?
最佳答案
... but when I try to put the local IP (which is 10.74.4.10), I get a 400 Bad Request response.
当您发送有效的 HTTP 请求时,您使用 Host
header 告诉服务器您想要访问在服务器上配置的主机名 10.74.4.10。这是否有效取决于服务器配置。例如,如果服务器配置为仅接受名称为 example.com
的请求,并考虑到其他所有内容都是错误的,那么它将只接受带有 Host: example.com
的请求,但不接受与 Host: 10.74.4.10
即使这可能是服务器的 IP 地址。
... I forgot to mention, the code stops at connect()
这根本没有任何意义。如果您在首次声称与站点的连接需要首先成功时收到 400 Bad Request
,这意味着它无法在 connect
中停止。
关于c - 使用套接字向 C 中的本地 IP 进行 GET 请求,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53447613/