2013-04-29 2 views
1

Я пытаюсь сделать запрос GET/POST. GET запрос сейчас. Я могу установить соединение, но ответ, который я получаю, никогда не бывает 200. Вот кодСделайте запрос Http с гнездами

int socketFD; 
    struct sockaddr_in myaddr; 
    // struct sockaddr_in hints; 
    socketFD = socket(AF_INET, SOCK_STREAM, 0); 
    if (socketFD == -1) { 
     NSLog(@"Error in making socket"); 
    }  
    myaddr.sin_port = htons(80); 
    memset(&myaddr.sin_zero, '\0', 8); 


    char *sendbug = "GET 173.194.66.99 HTTP/1.0\r\n\r\n"; 


    struct sockaddr_in dest,their_addr; 
    // struct addrinfo *res; 
    struct sockaddr sockAddrToDisplay; 

    dest.sin_family = AF_INET; 
    dest.sin_port = htons(80); 
    NSLog(@"%s",sendbug); 
    dest.sin_addr.s_addr = inet_addr("173.194.66.99"); // IP for google 


    int connectResult = connect(socketFD, (struct sockaddr *)&dest, sizeof(struct sockaddr)); 

    if (connectResult == -1) { 
     NSLog(@"Error connecting"); 
    } 

    int sendResult = sendto(socketFD, sendbug, strlen(sendbug), 0, (struct sockaddr *)&dest, sizeof(struct sockaddr)); 

    if (sendResult == -1) { 
     NSLog(@"Sendind failed"); 
    } 

    // int peerResult = getpeername(socketFD, (struct sockaddr *)&dest,(socklen_t *) sizeof(struct sockaddr)); 


    struct addrinfo hints, *res; 
    int sockfd; 
    int byte_count; 
    socklen_t fromlen; 
    struct sockaddr_storage addr; 
    char buf[512]; 
    char ipstr[INET6_ADDRSTRLEN]; 


    fromlen = sizeof addr; 
    byte_count = recvfrom(socketFD, buf, sizeof buf, 0,(struct sockaddr *) &addr, &fromlen); 

    NSLog(@"%s",buf); 

И ответ. Мне нужна помощь, когда я делаю неправильно, а также, как я могу сделать запрос HTTP POST. ТНХ заранее молодцы

<html> 
<head><title>400 Bad Request</title></head> 
<body bgcolor="white"> 
<center><h1>400 Bad Request</h1></center> 
<hr><center>nginx/1.3.7</center> 
</body> 
</html> 
∑¥ëXnr 
+0

весьма амбициозный проект: +1. Нильс предложил хороший совет: стандарты и рекомендации. Вы можете проверить свой ответ просто _telneting_ на свой сервер (на порту 80) и выдать команду 'GET /'. –

ответ

4

Ваша проблема здесь:

char *sendbug = "GET 173.194.66.99 HTTP/1.0\r\n\r\n"; 

протокол HTTP определяет запрос как <method> <resource> [HTTP/<version>]. Версия по умолчанию 1.0, а в 1.0 требуется только один символ новой строки в конце, и ресурс вы запрашиваете это домашняя страница, так что это должно быть:

char *sendbug = "GET /\r\n"; 

Я рекомендую читать вверх на HTTP- RFC, если вы пытаетесь реализовать пользовательский клиент, который также должен помочь вам в построении POST-запроса. И, пожалуйста, обновляйтесь до HTTP/1.1, а на нем не все веб-серверы чувствуют себя обязанными поддерживать 1.0 больше.

RFC 2616 - Hypertext Transfer Protocol -- HTTP/1.1

+0

Возможно, вы также захотите заголовок 'Host:'. –

+0

Thx для ответа .... я попробовал char * sendbug = "GET 173.194.66.99 HTTP/1.0 \ r \ n"; как вы сказали, но все же ответ такой же. И заголовки HTTP/1.1 выглядели несколько сложнее, поэтому я пытался отправить запрос с 1.0. – Azerue

+1

@MikeWeller 'Host' заголовок существует только в HTTP/1.1, не относящийся к запросу 1.0. –

Смежные вопросы