Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Использование библиотеки WinInet для разработки программ, работающих в глобальной сети



В разделах 2 и 3 мы рассмотрели несколько средства передачи данных между программами, запущенными на разных компьютерах. Все эти средства хорошо работают в локальной сети. Протоколы UDP и TCP работают как в локальной, так и в глобальной сети, но при условии единого пространства всех IP-адресов. Это условие означает, что в глобальной сети IP-адреса всех компьютеров, входящих в систему, должны быть истинными. Такое требование не всегда выполнимо, часто бывает так, что количество истинные IP-адресов ограничено, поэтому хотелось бы, чтобы истинный IP-адрес был только у одного компьютера, на котором работает программа «Сервер», а на остальных компьютерах были бы внутренние IP-адреса. Такую конфигурацию позволяет создать библиотека WinInet (сокращение от Windows Internet).

Ниже рассмотрим основные функции библиотеки.

Функция InternetOpen

Функция InternetOpen инициализирует WinInet и возвращает идентификатор, который необходим для вызова других функций WinInet. В случае неудачи возвращается NULL. Функция имеет 5 параметров.

Первый параметр задает имя нашего приложения, которое будет использовать библиотеку WinInet, в качестве этого параметра можно использовать любой текст, например “MyApplication”.

Второй параметр задаёт необходимый тип доступа (прямой или через прокси). Возможные варианты данного параметра:

̶ INTERNET_OPEN_TYPE_DIRECT – прямой доступ в Internet, без прокси;

̶ INTERNET_OPEN_TYPE_PROXY – доступ в интернет через прокси;

̶ INTERNET_OPEN_TYPE_PRECONFIG – тип доступа установлен в реестре.

Третий параметр указывает имя или IP-адрес и порт прокси-сервера. Записывается в виде “Server1: 8080” или “192.168.0.1: 8080”, где до двоеточия имя или IP-адрес прокси-сервера, а после двоеточия порт.

Четвертые параметр указывает список компьютеров, для которых не следует использовать прокси-сервер, например строка “192.168.10.*” говорит о том, что для доступа к компьютерам, чьи адреса начинаются с 192.168.10 не следует использовать прокси-сервер, а ко всем остальным следует. Третий и четвертый параметры следует указывать только, если второй параметр равен INTERNET_OPEN_TYPE_PROXY, иначе следует указывать NULL.

Пятый параметр – флаг, здесь можно использовать нулевое значение.

 

В качестве примера использования функции InternetOpen можно привести можно привести следующий фрагмент кода:

hInet = InternetOpen(L" MyApplicat", INTERNET_OPEN_TYPE_PROXY,

“192.168.0.1: 8080”, “192.168.0.*”, 0);

if (hInet == NULL) {

// Ошибка InternetOpen

} // if

Функция InternetConnect

Функция Internet Connect создает интернет-сессию для заданного сайта и возвращает идентификатор сессии,  который необходим для вызова некоторых последующих функций. В случае неудачи возвращается NULL. Функция имеет 8 параметров.

Первый параметр – идентификатор, который вернула функция InternetOpen. Второй параметр – имя или IP-адрес сервера. Третий параметр – порт сервера. Четвертый параметр – имя пользователя. Пятый параметр – пароль. Шестой параметр – тип сервиса, возможны следующие варианты: INTERNET_SERVICE_HTTP – HTTP сервис, INTERNET_SERVICE_FTP – FTP сервис и некоторые другие. Мы будем использовать сервис INTERNET_SERVICE_HTTP. Седьмой параметр – флаг, можно использовать нулевое значение. Восьмой параметр – контекст, также можно использовать нулевое значение.

В качестве примера использования функции InternetConnect можно привести следующий фрагмент кода:

hSession = InternetConnect(hInet, “www.sartasov.com”, SERVER_PORT,

L" Sartasov", L" 123", INTERNET_SERVICE_HTTP, 0, 0);

if (hSession == NULL) {

// Ошибка InternetConnect

} // if

В данном примере сервер, имя пользователя и пароль вымышлены.

Функция HttpOpenRequest

Функция HttpOpenRequest создает запрос к серверу и возвращает идентификатор запроса, который необходим для вызова некоторых последующих функций. В случае неудачи возвращается NULL. Функция имеет 8 параметров.

Первый параметр – идентификатор сессии, который вернула функция InternetConnection.

Второй параметр – имя команды запроса возможны следующие варианты: " GET" – запрос на получение данных от сервера и " POST" – запрос на отправку данных серверу с возможным получением ответных данных. Мы будем использовать " POST".

Третий параметр – имя целевого объекта, отправляемого на сервер. Мы будем использовать пустую строку.

Четвертый параметр – используемая версия HTTP протокола. Мы будем использовать " HTTP/1.1"

Пятый параметр – адрес предыдущего запроса, в данный момент не используется, рекомендуется подставлять пустую строку.

Шестой параметр – Определяет тип содержимого допускаемого клиентской стороной. Мы будем указывать NULL, это означает, что любой тип допустим.

Седьмой параметр – флаг. Возможных флагов много, рекомендуется использовать комбинацию следующих флагов:

̶ INTERNET_FLAG_EXISTING_CONNECT – используем существующее соединение;

̶ INTERNET_FLAG_NO_AUTO_REDIRECT – не переадресовываемся с сервера;

̶ INTERNET_FLAG_KEEP_CONNECTION – по окончании запроса сохраняем соединение.

Восьмой параметр – контекст, также можно использовать нулевое значение.

В качестве примера использования функции HttpOpenRequest можно привести следующий фрагмент кода:

hRequest = HttpOpenRequest(hSession, L" POST", L" ", L" HTTP/1.1", L" ",

NULL, INTERNET_FLAG_EXISTING_CONNECT |

INTERNET_FLAG_NO_AUTO_REDIRECT |

INTERNET_FLAG_KEEP_CONNECTION, 0);

if (hRequest == NULL) {

// Ошибка HttpOpenRequest

} // if

Функция HttpSendRequest

Функция HttpSendRequest отправляет запрос на сервер. Она имеет 5 параметров.

Первый параметр – идентификатор запроса, который вернула функция HttpOpenRequest. Второй параметр – указатель на дополнительные заголовки, можно использовать значение NULL. Третий параметр – размер дополнительных заголовков в байтах. Четвертые параметр – указатель на область передаваемых данных. Пятый параметр – размер передаваемых данных в байтах. В качестве примера использования функции HttpSendRequest можно привести следующий фрагмент кода:

Code = HttpSendRequest(hRequest, NULL, 0, “Проба пера”, 11);

if (! Code) {

Code = GetLastError();

// Ошибка HttpSendRequest с кодом Code

}

Функция HttpQueryInfo

После того, как запрос был отправлен серверу через интернет, следует ожидать ответ. Однако интернет – сеть относительно медленная, поэтому ответ придет возможно не слишком быстро и возможно по частям. Однако и анализировать ответ тоже можно по частям. Функция HttpQueryInfo показывает, какие части ответа уже пришли. Эта функция имеет 5 параметров. Первый параметр – идентификатор запроса.

Второй параметр – флаги частей ответа. Основными флагами являются:

̶ HTTP_QUERY_STATUS_CODE – код ошибки ответа (0–299 – нет ошибки, 300–399 – предупреждение, 400–499 – ошибка, 500–599 – фатальная ошибка, более подробную информацию по кодам ошибок можно получить в MSDN, на интернет странице http: //msdn.microsoft.com/en-us/library/windows/desktop/aa384325 (v=vs.85).aspx);

̶ HTTP_QUERY_RAW_HEADERS_CRLF – заголовок ответа;

̶ HTTP_QUERY_CONTENT_LENGTH – размер ответа в байтах.

С остальными флагами можно познакомиться в MSDN, на интернет странице http: //msdn.microsoft.com/en-us/library/windows/desktop/aa385351

(v=vs.85).aspx.

Третий параметр – указатель на область памяти, в которую будет записана часть ответа.

Четвертый параметр – указатель на целочисленную беззнаковую переменную, в которую заносится размер области памяти.

Пятый параметр – индекс, рекомендуемое значение NULL.

В случае успешной работы функция возвращает значение истина, при ошибке – ложь.

В качестве примера использования функции HttpQueryInfo можно привести следующий фрагмент кода, получающий код возврата запроса:

char Buf[11];

unsigned int Len = 10;

int Code = HttpQueryInfo(hRequest, HTTP_QUERY_STATUS_CODE,

Buf, & Len, NULL);

if (! Code) {

// Ошибка HttpQueryInfo при определении кода возврата.

return;

} // if

Code = _wtoi(Buf);

if (Code > = 300) {

// От сервера получен ошибочный код возврата Code

return;

} // if

Функция InternetReadFile

Рассмотренная в предыдущем пункте, функция HttpQueryInfo позволяет получать части ответа, но только служебные части, а основную часть ответа можно получить с помощью функции InternetReadFile . Данная функция имеет имеет 4 параметра. Первый параметр – идентификатор запроса. Второй параметр –указатель на область памяти, в которую будет записаны полученные данные. Третий параметр – размер области. Четвертый параметр – указатель на переменную, в которую будет записано кол-во реально пришедших байт. В случае успешной работы функция возвращает значение истина, при ошибке – ложь.

В качестве примера использования функции можно привести следующий фрагмент кода:

char Buf[11], *Buf2;

int Len = 10, Len2;

Code = HttpQueryInfo(hRequest,   HTTP_QUERY_CONTENT_LENGTH,

Buf, & Len, NULL);       

if (! Code) {

// Ошибка HttpQueryInfo(HTTP_QUERY_CONTENT_LENGTH)

return;

} // if

Len = _wtoi(Buf);

if (Len < = 0) {

// Ошибка в размере ответа

return;

} // if

Buf2 = (char *)malloc(Len+1);

if (Buf2 == NULL) {

// Недостаточно памяти

return;

} // if

Code = InternetReadFile(hRequest, Buf2, Len, & Len2);  

if (! Code) {

// Ошибка при получении ответа

return;

} // if

if (Len! = Len2) {

 

// Должно было прийти Len байт

} // if

Пример программ, использующих библиотеку WinInet

Аналогично всем предыдущим примерам, данный пример состоит из двух программ «Клиент» и «Сервер». Дизайн программы «Клиент» приведен на рис. 4.1, дизайн программы «Сервер» на рис. 4.2.

Рис. 4.1. Дизайн программы «Клиент», использующих библиотеку WinInet

Рис. 4.2. Дизайн программы «Сервер», использующих библиотеку WinInet

Рассмотрим основные действия программы «Клиент». При нажатии кнопки «Отправить» выполняются следующие действия:

̶ преобразование содержимого полей ввода из типа String в массив типа char;

̶ инициализация библиотеки WinInet (функция InternetOpen);

̶ создание интернет-сессии (InternetConnect);

̶ создание запроса к серверу (HttpOpenRequest);

̶ отправка запроса (HttpSendRequest);

̶ включение таймера для приема ответа.

По таймеру выполняются следующие действия:

̶ получаем код ответа, если код ответа больше или равен 300, то ошибка (функция HttpQueryInfo с параметром HTTP_QUERY_STATUS_CODE);

̶ получаем заголовок ответа (функция HttpQueryInfo с параметром HTTP_QUERY_RAW_HEADERS_CRLF);

̶ получает размер ответа (функция HttpQueryInfo с параметром HTTP_QUERY_CONTENT_LENGTH);

̶ получаем ответ (функция InternetReadFile).

Программа «Сервер» аналогична соответствующей программе, использующей протокол TCP. Основные действия этой программы описаны в пункте 2.4, поэтому здесь мы их рассматривать не будем.

Текст программы «Клиент», использующей библиотеку WinInet, приведен в приложении 8, «Сервер» в приложении 9.

4.8. Контрольные вопросы.

1. Для чего используется функция InternetOpen.

2. Для чего используется функция InternetConnect.

3. Для чего используется функция HttpOpenRequest.

4. Для чего используется функция HttpSendRequest.

5. Для чего используется функция HttpQueryInfo.

6. Для чего используется функция InternetReadFile.

7. С помощью какой функции инициализируется библиотека WinInet.

8. С помощью какой функции создается интернет-сессия.

9. С помощью какой функции создается интернет-запрос.

10. С помощью какой функции можно послать данные с использованием библиотеки WinInet.

11. С помощью какой функции можно получить информацию о пришедших данных с использованием библиотеки WinInet.

12. С помощью какой функции можно получить пришедшие данные с использованием библиотеки WinInet.


Заключение

В данное учебное пособие посвящено разработке вычислительных систем, работающих на нескольких компьютеров. В качестве средств передачи информации между компьютерами используются компьютерные сети и телекоммуникации.

Пособие состоит из четырех глав. В первой главе пособия описаны аппаратные и программные средства, необходимые для построения, настройки и оптимизации сети. Во второй главе рассматриваются вопросы разработки вычислительных систем с использованием сетевых протоколов передачи информации UDP и TCP. В третьей главе описаны способы передачи и приема информации с помощью каналов Mailslot и Pipe. В четвертой главе рассматриваются отличия передачи информации в локальных и глобальных компьютерных сетях, для работы с глобальными сетями используется библиотека функций WinInet.

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

Пособие ориентировано на студентов направления 230700.62 «Прикладная информатика», изучающих предмет «Вычислительные системы, сети и телекоммуникации».

Для изучения данного предмета требуются знания следующих предметов: «Информатика и программирование» и «Высокоуровневые методы информатики и программирования». Знания, полученные при изучении данного предмета, могут быть использованы для изучения других предметов: «Интернет-программирование» и «Управление информационными системами».

 


Библиографический список

Основной:

1. Пятибратов, А. П. Вычислительные системы, сети и телекоммуникации: учебник для вузов по специальности " Приклад. информатика в экономике" / А. П. Пятибратов, Л. П. Гудыно, А. А. Кириченко; под ред. А. П. Пятибратова. – М.: Финансы и статистика: ИНФРА-М, 2008. – 733 с. 

2. Бройдо, В. Л. Вычислительные системы, сети и телекоммуникации: учебное пособие для вузов по направлениям " Приклад. информатика", " Информ. системы в экономике" / В. Л. Бройдо – СПб.: Питер, 2008. –  766 с.

3. Олифер, В.Г. Основы компьютерных сетей / В.Г. Олифер, Н.А. Олифер. – СПб.: Питер, 2009. – 352 с.

4. Олифер, В.Г. Компьютерные сети. Принципы, технологии, протоколы: учебное пособие / В.Г. Олифер, Н.А. Олифер. – СПб.: Питер, 2007. – 958 с.

Дополнительный:

5. Компьютерные системы и сети: Учеб. пособие по экон. специальностям вузов / В. П. Косарев, Л. В. Еремин, О. В. Машникова и др.; Под ред.: В. П. Косарева, Л. В. Еремина. – М.: Финансы и статистика, 1999. – 96 с.

6. Галкин, В.А. Телекоммуникации и сети: учебное пособие / В.А. Галкин, Ю.А. Григорьев. – М.: МГТУ им. Н.Э. Баумана, 2003. – 608 с.

7. Кузин, А.В. Компьютерные сети: учебное пособие / А.В. Кузин, В.М. Дёмин. – М.: ФОРУМ, 2005. – 192 с.

8. Мелехин, В.Ф. Вычислительные машины, системы и сети: учебник / В.Ф. Мелехин, Е.Г. Павловский. – М.: Академия, 2006. – 560 с.

9. Фролов, А.В. Библиотека системного программиста. В 34 томах. Т. 23: Глобальные сети компьютеров. Практическое введение в Internet, E-Mail, FTP, WWW и HTML, программирование для Windows Sockets. Т 27: Программирование для Windows NT / А.В. Фролов, Г.В. Фролов. – М.: " ДИАЛОГ-МИФИ", 1996-1997. – 234 с.

 


Приложения

Приложение 1


Поделиться:



Последнее изменение этой страницы: 2020-02-16; Просмотров: 182; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.055 с.)
Главная | Случайная страница | Обратная связь