Ничего не получая после отправки HTTP-запроса на сервер на языке Си - PullRequest
0 голосов
/ 14 ноября 2018

Я хотел бы создать небольшой загрузчик на языке Си.Все было хорошо, пока я не хотел получить содержание веб-страницы.Каждый раз ответ пуст, потому что ничего не отображается.Я не понимаю, почему.

Я получаю хост, номер порта и путь благодаря регулярному выражению, но я не показываю его, потому что SO говорит, что мой пост в основном код ...

#define BUF_SIZE 100

int main (int argc, char *argv[] )
{
  int s;
  int response;
  struct sockaddr_in sin; 
  struct hostent *hptr;

  char * regexHost = "^https?://([^:0-9/]*):?([0-9]*)?(.*)$";
  size_t maxGroups = 4;

  char * host;
  char * port;
  char * path;
  char *request = malloc(256);
  char buf[BUF_SIZE];

  /* Creating socket */
  printf("Creating socket...\n");
  if ( (s = socket(PF_INET, SOCK_STREAM, 0 ) ) < 0) /* create socket*/
    { 
      perror("error on socket\n");  /* socket error */
      return -1;
    }
  else
    {
        printf("Successfully created socket\n");
    }

  sin.sin_family = PF_INET; /*set protocol family to Internet */

  /*Getting host*/
  printf("Getting host...\n");
  if ( (hptr =  gethostbyname(host) ) == NULL)
    {
      fprintf(stderr, "gethostname error: %s\n", host);
      return -1;
    }
  else
    {
        printf("Successfully got host\n");
    }

  /* Connect to the server */
  printf("Connecting...\n");
  memcpy( &sin.sin_addr, hptr->h_addr, hptr->h_length);
  if (connect (s, (struct sockaddr *)&sin, sizeof(sin) ) < 0 ) 
    {
      perror("error on connect\n"); return -1;   /* connect error */
    }
  else
    {
        printf("Successfully connected\n");
    }

  /* send headers to connection*/
  sprintf(request, ("GET %s HTTP/1.1\r\nHost: %s\r\n"), path, host);
  printf("%s\n", request);

  if( send(s, request, strlen(request), 0) < 0)
    {
      puts("Send failed");
      return 1;
    }
   else
    {
      printf("Successfully sent HTTP fetch request\n");
    }

  while ((response = recv(s, buf, BUF_SIZE-1, 0)) > 0) 
    {
      buf[response] = 0;
      printf("Response : %s\n", buf);
      fputs(buf, stdout);
      memset(buf, 0, BUF_SIZE);
    }

  /* close connection, clean up socket */
  if (close(s) < 0) 
    { 
      perror("error on close");   /* close error */
      return -1;
    }
  return 0;
}

1 Ответ

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

Согласно RFC 7230 :

Все сообщения HTTP / 1.1 состоят из стартовой строки, за которой следует последовательность октетов в формате, аналогичном Интернет-сообщению Формат [RFC5322]: ноль или более полей заголовка (совместно именуемых в качестве "заголовков" или "раздела заголовка"), пустой строки с указанием конца раздела заголовка и необязательного сообщения корпус.

 HTTP-message   = start-line
                  *( header-field CRLF )
                  CRLF
                  [ message-body ]

Обратите внимание, что после CRLF "Стартовая линия" (дополнительный материал) есть еще один CRLF, чтобы указать, что именно здесь заканчиваются заголовки.

Итак, добавьте еще "\r\n" в конец строки вашего запроса при вызове sprintf, который ее строит.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...