2016-09-20 6 views
2

Это сервер, на котором я учусь: http://blog.abhijeetr.com/2010/04/very-simple-http-server-writen-in-c.html.C HTTP-сервер отправляет запросы на мой сервер?

Я полностью не понимаю серверы получения запросов и т. П. Как я могу отправить запрос на получение? Причина, по которой я не думаю, что знаю, как это сделать, заключается в том, что все учебники указывают на получение запроса с веб-сайта, пока это из моего текущего каталога или, по крайней мере, из того, что я понимаю.

Это школьное задание, нам разрешено копировать код для этого задания, однако мы должны указать автора. Дело в том, чтобы узнать, как работают веб-серверы, и я не понимаю, что делает запрос Get, и как я могу реализовать его на этом конкретном сервере, чтобы я мог изучить его эффекты.

Благодарим вас и ниже, это конкретный код, который я хочу поразить. Я хочу проверить разные запросы на получение, чтобы узнать, какие ответы или ошибки я могу получить.

if ((fd=open(path, O_RDONLY))!=-1) 
{ 
    send(clients[n], "HTTP/1.0 200 OK\n\n", 17, 0); 
    while ((bytes_read=read(fd, data_to_send, BYTES))>0) 
     write (clients[n], data_to_send, bytes_read); 
} 
else write(clients[n], "HTTP/1.0 404 Not Found\n", 23); //FILE NOT FOUND 
+1

Зачем вам отправлять * запросы * с сервера? Клиент отправляет запросы, и вы отвечаете ответами. –

+0

Что касается создания запросов, просто сделайте это в своем локальном браузере? Или используйте инструменты командной строки, такие как 'curl'? –

+0

Как я уже сказал, я не знаю, что я делаю, я не знаю в первую очередь о серверах. Клиент отправляет запрос, и я отвечаю. Я уверен, что у этого сервера уже есть ответы. Как выглядит команда curl? http://stackoverflow.com/questions/27422918/send-http-get-request-using-curl-in-c показывает один. Но опять же я даже не знаю, есть ли у этого URL-адрес, и если он сделает то, что будет – TheMangaStand

ответ

0

Посмотрите на HTTP 1.1 RFC#GET, чтобы получить представление о том, для чего запрос GET является. Когда вы используете браузер для посещения веб-сайта (все веб-сайты работают на каком-то HTTP-сервере), ваш браузер действует как клиент, а веб-сайт действует как сервер. Клиент инициирует запрос, и сервер отвечает на этот запрос.

Основной запрос (инициированный браузером в ответ на URL-адрес пользователя, который пытается просмотреть) - это запрос GET.

Например, если пользователь хочет посетить URL-адрес http://www.example.com/index.htm, браузер подключается к TCP-порту 80 (по умолчанию) сервера www.example.com. После того, как соединение установлено, браузер начинает «разговор» со стандартным запросом GET, который может выглядеть следующим образом:

GET /index.htm HTTP/1.1 
Host: www.example.com 
User-Agent: Mozilla/5.0 (X11; U; Linux x86_64; sv-SE; rv:1.8.1.12) Gecko/20080207 Ubuntu/7.10 (gutsy) Firefox/2.0.0.12 
Accept: text/html,application/xhtml+xml,application/xml;q=0.9,*/*;q=0.8 
Accept-Language: en-US,en;q=0.5 
Accept-Encoding: gzip, deflate 
Connection: keep-alive 

Любые заголовки после первой строки (строка запроса) не являются обязательными, хотя любой браузер всегда будет хотеть включить заголовок «Host», поскольку большинство веб-сайтов не будут работать без него (это позволяет нескольким веб-сайтам совместно использовать один IP-адрес). В этом случае сервер не может знать, какой веб-сайт вы хотите посетить, не указав здесь имя хоста.

запрос GET голый минимум для извлечения index.htm на этом сервере будет просто:

GET /index.htm HTTP/1.1 

ВНИМАНИЕ, что конец запроса завершается двойной CRLF последовательности (ASCII коды 13 и 10) , один для самой последней строки заголовка, другой для обозначения конца заголовков запросов. После того, как сервер получает двойную последовательность CRLF, сервер отвечает соответственно строкой состояния и кодом (был ли найден документ?). Если документ был найден, он возвращается в ответ обычно с кодом состояния HTTP 200, заголовками ответов (они имеют тот же формат, что и заголовки запроса), двойная последовательность CRLF, за которой следует тело запрашиваемого файла. Стандарт HTTP называет это «сущностью». В этом случае возвращаемым объектом будет содержимое index.htm. Используя пример выше, сервер может ответить так:

HTTP/1.1 200 OK 
Content-Type: text/html 
Content-Length: 66 
Last-Modified: Wed, 14 Sep 2016 13:05:21 GMT 

<html> 
<body> 
    Welcome to my example page 
</body> 
</html> 

Так что это простой пример HTTP GET/разговора ответ в двух словах, хотя можно предположить, что вещи могут получить более сложным, в зависимости от запроса и ответа заголовки.

Чтобы ответить на вопрос о том, как вручную отправить запрос GET на работающий сервер, мне нравится использовать «curl -i» на Linux-машине. Curl действует как клиент/broswer, позволяющий указать URL-адрес, который вы хотите получить (загрузить).Например:

Опция -i вызывает скручивание, чтобы отобразить весь ответ веб-сервера (включая заголовок ответа HTTP), а не только лица, которые в этом случае являются содержание Test.htm. Вам просто нужно настроить URL-адрес выше, чтобы он соответствовал URL-адресу вашего веб-сервера, будь то на том же компьютере или в другом месте в сети.