Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
чтиво_ч3.doc
Скачиваний:
4
Добавлен:
15.11.2019
Размер:
435.2 Кб
Скачать

Сетевое программирование. Часть 3: Клиент-Сервер



Ну что ж. Теория закончилась и перейдем к долгожданным практическим примерам. Первая модель, которую я хочу Вам объяснить, пожалуй, самая простая – блокирующие socket’ы. WinSock функции, работающие с блокирующими socket’ами, не передадут управления программе, пока функция не завершится или не возникнет ошибка в ее выполнении. Данное поведение дает довольно линейный ход программы, поэтому блокирующие socket’ы просты в использовании. В первой части статьи я рассказал Вам о некоторых WinSock функциях, которых будет вполне достаточно для программирования блокирующих socket’ов, хотя и в этом разделе я покажу Вам некоторые дополнительный функции, которые будут полезны для последующего изучения материала. Хотя Вам может показаться неинтересным использование блокирующих socket’ов, если Вы планируете использовать неблокирующие модели ввода/вывода, я настоятельно рекомендую прочитать раздел о блокирующих socket’ах, поскольку они охватывают основы программирования socket’ов и другие полезные свойства WinSock.

Среда

Перед тем как начать писать код, необходимо настроить среду для разработки проекта. Я, как обычно, буду использовать Microsoft Visual Studio 2010. Если Вы используете другую среду, то Вам придется покопаться в документации к Вашему компилятору. Ниже будет приведен пример настройки приложения для клиентской части. Для серверной части все полностью аналогично, за исключением имени приложения. Поэтому серверную часть Вы настроите сами.

Создаем проект

Этот процесс я уже описывал в своих статьях, поэтому в данной статье обойдемся без скриншотов. File -> New -> Project (Ctrl+Shift+N). Далее в установленных шаблонах выбираем шаблоны Visual C++ -> Win32 -> Win32 Console Application. Даем нашему проекту имя (в моем случае это будет Head Request Client) и жмем ОК. Перед Вами появляется, так называемый, wizard Вашего приложения. В нем либо жмете кнопку «Next», либо в колонке слева выбираете «настройки приложения (Application Settings)». Там в типе приложения (application type) выбираете «консольное приложение (console application)», а в «дополнительных параметрах (additional options)» жмете флажок возле «перекомпелированный заголовок (Precompiled header)». После нажатия кнопки «Finish» наш проект готов.

Настраиваем проект Для корректной работы проекта нам так же необходимо изменить в настройках проекта два параметра. Первый параметр нужен для работы WinSock функций. Т.к. мы туда передаем типа char, а в настройках компилятора по-умолчанию стоит тип либо TCHAR, либо LPCWSTR. Для этого проделайте шаги в соответствии со скриншотами.

Далее переходим в Linker и подключаем к нашему проекту ws2_32.lib. Эта библиотека нужна, чтобы у вас не возникло множество ошибок в процессе компиляции, связанных с именами функций.

После нажатия «Edit» перед Вами должно появится окошко, в которое пальчиками вводим «ws2_32.lib». Жмем «ОК», затем «Применить», затем снова «ОК» и все. Проект готов к работе. Переходим к коду.

Клиент

Первый пример – простая программа-клиент, которая подключается к веб-порталу и делает запрос. Программа будет представлять консольное приложение, т.к. они (консольные приложения) отлично подходят для работы с блокирующими socket’ами. Я полагаю, что не все могут похвастаться знаниями протокола HTTP (проткол, используемый для веб соединений), поэтому вкратце я расскажу, что происходит (тем более, что в первой части статьи я обещал ознакомить Вас с протоколами). -Клиент подключается к серверу (по умолчанию 80 порт) -Сервер принимает соединение и ждет -Клиент отправляет HTTP - запрос в виде сообщения запроса HTTP -Сервер отвечает на этот запрос ответным HTTP – сообщением -Сервер закрывает соединение (вообще, это зависит от значения заголовка HTTP – соединения, но для простоты будем считать, что соединение всегда будет закрываться). HTTP следует типичной клиент – сервер модели: клиент и сервер общаются друг с другом по очереди. Клиент инициирует запросы, а сервер реагирует на них ответом. HTTP – запрос включает в себя методы запроса. Три, наиболее часто используемых, метода: GET, POST и HEAD. GET используется для получения ресурсов из сети Интернет (веб-страницы, изображения и т.д.). POST сначала отправляет данные на сервер (например, данные формы заполненные пользователем), а затем получает ответ сервера. И наконец HEAD подобен GET, за исключением того, что данные не отправляются с сервера, а отправляется только ответное HTTP – сообщение. HEAD используется как быстрый способ проверки, была ли изменена страница, без необходимости загружать полные данные странице. В примере я буду использовать HEAD, т.к. GET может вернуть некоторые данные с сервера, в то время как HEAD вернет лишь код ответа и набор заголовков. Поэтому результат выполнения программы будет легче для чтения и анализа. Типичный HTTP – запрос с методом запроса HEAD выглядит так:

HEAD / HTTP/1.1 <crlf>

Host: <a href="http://www.google.com">www.google.com</a> <crlf>

User-agent: HeadReqSample <crlf>

Connection: close <crlf>

<crlf>

Первый / в первой строке означает адрес страницы, содержимое которой мы хотим получить. В данном случае это страница по умолчанию. HTTP/1.1 означает версию HTTP проткола. В поле Host указывается сервер, на котором находится нужная нам страница. User-Agent — тип браузера. Connection: close означает что после получения ответа надо закрыть соединение. После получения такого запроса, с сервера придет ответ в следующей форме:

HTTP/1.1 Response-code Response-message <crlf>

header-name: value <crlf>

header-name: value <crlf>

header-name: value <crlf>

<crlf>

Как Вы можете видеть, формат ответа многим похож на формат запроса. Код ответа состоит из трех цифр, который сигнализирует об удачном или неудачном завершении запроса. Обычно коды бывают следующие: 200 (все OK), 404 (страница не найдена, Вы вероятнее всего не раз сталкивались с таким кодом =) ) и 302 (страница найдена, но находится в другом месте, происходит перенаправление с Вашей страницы, не другую). Ответное сообщение представляет собой понятную человеку версию кода ответа и может быть любым, каким пожелает сервер. Пока что нам хватит ускоренного курса HTTP. Если Вы захотите узнать больше о этом протоколе – воспользуйтесь поисковиком. В Интернете полно информации о нем.

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]