繁体   English   中英

使用套接字在C中获取对本地IP的请求

[英]GET request to a local IP in C with sockets

我正在尝试将C代码组合到向本地IP地址发出一个HTTP GET请求(在我的网络中),该本地IP地址的网页在端口80上运行。该请求应返回index.html

该代码适用于具有DNS的真实IP的网站 (我已经用www.olx.ro及其IP进行了测试),但是当我尝试放置本地IP(即10.74.4.10)时,我得到了400错误的请求响应。

这是代码:

#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("10.74.4.10") inet_addr("2.16.128.73")"GET /index.html HTTP/1.0\\r\\nHost:10.74.4.10:80\\r\\n\\r\\n""GET /index.html HTTP/1.0\\r\\nHost:www.olx.ro:80\\r\\n\\r\\n" ,那么代码将按预期工作。

另外,我想提到我将Repl.it用作C编译器。

编辑:我忘了提,代码停在connect() 我尝试使用bind() ,仍然无法正常工作。 也许是因为我试图使用无法具有root用户访问权限的在线C编译器连接到特权端口(80)?

...但是当我尝试放置本地IP(即10.74.4.10)时,我收到了400错误的请求响应。

在发送有效的HTTP请求时,您使用Host标头告诉服务器您要访问在服务器上配置的主机名10.74.4.10。 是否可行取决于服务器配置。 例如,如果将服务器配置为仅接受对名称example.com请求,并考虑其他所有错误,则即使该Host: 10.74.4.10可能是IP地址,它也仅接受Host: example.com请求,而不接受Host: 10.74.4.10请求。服务器。

...我忘了提,代码停在connect()

这根本没有任何意义。 如果您在第一次声称收到400 Bad Request时首先要求成功连接到站点,这意味着它不能在connect停止。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM