2015-09-23 4 views
1

Я пытаюсь сделать подключение localhost на порт 80 и отправить простой запрос HTTP-запроса, и одновременно я запускаю wirehark и смотрю на заголовки. Вот мой код:C: Отправка запроса http get в linux

#include <stdio.h> 
#include <stdlib.h> 
#include <string.h> 
#include <unistd.h> 
#include <sys/types.h> 
#include <sys/socket.h> 
#include <pthread.h> 
#include <netinet/in.h> 
#include <errno.h> 
#include <string.h> 


int main(int argc, char *argv[]) 
{ 

    int yes = 1; 
char buffer[1024]; 
int newsockfd, portno, recv_length, sockfd; 
socklen_t clilen; 
struct sockaddr_in serv_addr, cli_addr; 
ssize_t number; 
if (sockfd < 0) 
    error("ERROR opening socket"); 
bzero((char *) &serv_addr, sizeof(serv_addr)); 


    sockfd = socket(AF_INET, SOCK_STREAM, 0); 

serv_addr.sin_family = AF_INET; 
serv_addr.sin_addr.s_addr = 0; 
serv_addr.sin_port = htons(80); 




connect(sockfd,(struct sockaddr *) &serv_addr,sizeof(serv_addr)); 


if(send(sockfd, 


"GET/HTTP/1.1\r\n 
Host: localhost\r\n 
Connection: Keep-alive\r\n 
Cache-Control: max-age=0\r\n 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,;q=0.8\r\n 
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.91 Safari/537.36\r\n 
Accept-Encoding: gzip, deflate, sdch\r\n 
Accept-Language: en-US,en;q=0.8\r\n\r\n", 

strlen("GET/HTTP/1.1\r\n 
Host: localhost\r\n 
Connection: Keep-alive\r\n 
Cache-Control: max-age=0\r\n 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,;q=0.8\r\n 
User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.91 Safari/537.36\r\n 
Accept-Encoding: gzip, deflate, sdch\r\n 
Accept-Language: en-US,en;q=0.8\r\n\r\n"), 

0) > 0) 

{ 
    printf("GET send from %d\n", sockfd); 
} 
else 
{ 
    printf("Problem in send %s\n", strerror(errno)); 
} 

Но когда я его компилирую и запускаю, это дает мне много эров. here is the image of errros. После этой ошибки я изменил функцию отправки на это
отправить (sockfd, "GET/HTTP/1.1 \ r \ n Host: localhost \ r \ n \ r \ n", strlen ("GET/HTTP/1.1 \ r \ п Ведущий: локальный \ г \ п \ г \ п ")
Компиляция прошло нормально, но Wireshark показывает мне HTTP/1.0 400 BAD REQUEST (текст/HTML) Поэтому у меня есть несколько вопросов
1) Что такое. разница между функциями отправки, которые я использовал? Я имею в виду это действительно имеет значение, если я посылаю
GET/HTTP/1.1 \ г \ п Хост: локальный \ г \ п \ г \ п
или
GET/HTTP/1.1 \ г \ п Хост: локальный \ r \ n Связь: Keep-alive \ r \ n Cache-Control: max-age = 0 \ r \ n Принять: текст/html, application/xhtml + xml, application/xml; q = 0.9, image/webp,; q = 0,8 \ r \ n User-Agent: Mozilla/5.0 (X11; Linux i686) AppleWebKit/537.36 (KHTML, например, Gecko) Chrome/40.0.2214.91 Safari/537.36 \ r \ n Accept-Encoding: gzip, deflate, sdch \ r \ n Accept-язык: en-US, en; q = 0,8 \ r \ n \ r \ n
2) Как настроить функцию отправки в m ake правильный HTTP GET запрос?
Надеюсь, вы сможете помочь. Благодарю.

ответ

0

У вас есть буквальные символы новой строки внутри вашей строки! Вам нужно закрыть и повторно открыть кавычки в каждой строке. Например:

if(send(sockfd, 
"GET/HTTP/1.1\r\n" 
"Host: localhost\r\n" 
"Connection: Keep-alive\r\n" 
"Cache-Control: max-age=0\r\n" 
... 
+1

Теперь Wireshark дает мне "GET/HTTP/1.1 Продолжение или не-HTTP трафик" – Ojs

+0

О, я использовал двойной \ г \ п в хосте. Виноват. Спасибо :) Не могли бы вы ответить на первый вопрос? – Ojs

+0

@ Ojs Трудно понять, как это вопрос. В принципе, я бы сказал, что вы должны прочитать спецификацию HTTP и понять, что делает каждый из этих заголовков. –

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