Я пытаюсь собрать код 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-доступ?