在C中向freegeoip发送HTTP GET请求

在C中向freegeoip发送HTTP GET请求,c,http,get,freegeoip,C,Http,Get,Freegeoip,我在Windows上编写了一个C程序,用它来获取我的位置。这方面只是说我必须以freegoip.net/{format}/{IP_或_hostname}格式发送HTTP GET请求,其中IP_或_hostname是可选的,格式可以是csv、xml或json。所以我做了: // .... //Create a socket if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET){ printf("Could not c

我在Windows上编写了一个C程序,用它来获取我的位置。这方面只是说我必须以freegoip.net/{format}/{IP_或_hostname}格式发送HTTP GET请求,其中IP_或_hostname是可选的,格式可以是csv、xml或json。所以我做了:

// ....

//Create a socket
if((s = socket(AF_INET , SOCK_STREAM , 0 )) == INVALID_SOCKET){
    printf("Could not create socket : %d" , WSAGetLastError());
}

printf("Socket created.\n");
server.sin_addr.s_addr = inet_addr("104.31.11.172"); //Actual address of url
server.sin_family = AF_INET;
server.sin_port = htons( 80 ); //Http port

//Connect to remote server
if (connect(s , (struct sockaddr *)&server , sizeof(server)) < 0){
    puts("connect error");
    return 1;
}
puts("Connected");

//Send some data
//I think this might be the error:
message = "GET freegeoip.net/csv HTTP/1.0\r\n\r\n"; 

if( send(s , message , strlen(message) , 0) < 0){
    puts("Send failed");
    return 1;
}
puts("Data Send\n");

//Receive a reply from the server
if((recv_size = recv(s , server_reply , 2000 , 0)) == SOCKET_ERROR){
    puts("recv failed");
}

puts("Reply received\n");

//Add a NULL terminating character to make it a proper string before printing
server_reply[recv_size] = '\0';
puts(server_reply);

但我得到的唯一响应是400个错误请求或403个禁止。请尝试在csv之后添加一个
/
。您可以添加一个
host:
lineHTTP响应代码400可能是由于header
host
缺席引起的。403可能是由于缺少其他标头引起的,例如,
用户代理、url路径或HTTP方法。推荐阅读。
message = "GET /csv HTTP/1.0\r\n\r\n";