GET запрос на локальный IP в C с сокетами - PullRequest
0 голосов
/ 23 ноября 2018

Я пытаюсь собрать код C, который отправляет HTTP GET запрос на локальный IP-адрес (в моей сети), веб-страница которого работает на порту 80. Запрос должен возвращать index.html. * 1003.*

Код работает для веб-сайта с реальным IP-адресом, который имеет DNS (я проверил с 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("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(), все еще не работает.Может быть, это потому, что я пытаюсь подключиться к привилегированному порту (80) с онлайн-компилятором C, который не может иметь root-доступ?

1 Ответ

0 голосов
/ 23 ноября 2018

... но когда я пытаюсь указать локальный IP-адрес (10.74.4.10), я получаю ответ 400 Bad Request.

Пока вы отправляете действительный HTTP-запросвы сообщаете серверу, используя заголовок Host, что хотите получить доступ к имени хоста 10.74.4.10, настроенному на сервере.Если это работает или нет, зависит от конфигурации серверов.Например, если сервер настроен на прием только запросов на имя example.com и считает все остальное неправильным, он будет принимать запросы только с Host: example.com, но не с Host: 10.74.4.10, даже если это может быть IP-адрес сервера.

... Я забыл упомянуть, код останавливается на connect ()

Это вообще не имеет никакого смысла.Если вы получаете 400 Bad Request, когда впервые заявляете, что соединение с сайтом должно быть успешным, то это означает, что его нельзя было остановить в connect.

...