Я пытаюсь сделать подключение 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 запрос?
Надеюсь, вы сможете помочь. Благодарю.
Теперь Wireshark дает мне "GET/HTTP/1.1 Продолжение или не-HTTP трафик" – Ojs
О, я использовал двойной \ г \ п в хосте. Виноват. Спасибо :) Не могли бы вы ответить на первый вопрос? – Ojs
@ Ojs Трудно понять, как это вопрос. В принципе, я бы сказал, что вы должны прочитать спецификацию HTTP и понять, что делает каждый из этих заголовков. –