c - 使用套接字向 C 中的本地 IP 进行 GET 请求

标签 c sockets get host repl.it

我正在尝试编写一个 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/

相关文章:

c - C 中的阿姆斯特朗数

c++ - 解析通过 netcat 发送的字节

c - 在客户端套接字程序中使用 select()

javascript - 使用 JS 创建用户屏幕截图并通过 ajax 问题发送到服务器

c - 为什么我创建的支持主程序的 C 文件不从 main 继承包含和定义?

c - 使用 snprintf 打印整数值

c - Arduino 系列在 Debian 上运行良好,但在 Raspbian 上挂起

sockets - 你能在没有互联网的情况下通过 IP/TCP 通话吗?

PHP GET变量数组注入(inject)

json - 如何从 Go http.Request 中检索对象?