Читайте также: |
|
Основы Winsock
В этом разделе описаны основные методики и API-вызовы, необходимые для написания сетевых приложений. Здесь рассмотриваются способы установления соединения между двумя компьютерами в сети и механизмы обмена данными. К методичке прилагается набор примеров клиент-серверных приложений. Единственная зависящая от протокола операция — это создание сокета. Большинство остальных вызовов функций Winsock, ответственных за установление соединения, отправку и прием данных, не зависят от протокола. Примеры этого раздела помогут вам лучше понять вызовы Winsock, необходимые для установления соединений и обмена данными. Наша цель — изучить эти вызовы, поэтому в примерах используются прямые блокирующие вызовы Winsock. Другие модели ввода-вывода, реализованные в Winsock, обсуждаются в следующем разделе.
Инициализация Winsock
Любое Winsock-приложение перед вызовом функции должно загрузить соответствующую версию библиотеки Winsock. Если этого не сделать, функция вернет значение SOCKET_ERROR и выдаст ошибку WSANOTINITIALISED. Загрузку библиотеки Winsock выполняет функция WSAStartup:
int WSAStartup(
WORD wVersionRequested,
LPWSADATA lpWSAData
);
Параметр wVersionRequested задает версию загружаемой библиотеки Winsock. Старший и младший байты определяют дополнительный и основной номер версии библиотеки соответственно. Для получения значения параметра wVersionRequested можно использовать макрос MAKEWORD(x, у), где х — старший байт, а у — младший.
Параметр lpWSAData — указатель на структуру LPWSADATA, которая при вызове функции WSAStartup заполняется сведениями о версии загружаемой библиотеки:
typedef struct WSAData {
WORD wVersion;
WORD wHighVersion;
char szDescription[WSADESCRIPTION_LEN +1];
char szSystemStatus[WSASYS_STATUS_LEN +1];
unsigned short iMaxSockets;
unsigned short iMaxUdpDg;
char* lpVendorlnfo;
} WSADATA, *LPWSADATA;
WSAStartup присваивает параметру wVersion значение загружаемой версии. Параметр wHighVersion содержит номер последней доступной версии Winsock. Помните, что в обоих полях старший байт определяет дополнительный, а младший — основной номер версии. Поля szDescription и szSystemStatus заполняются не во всех реализациях Winsock и практически не применяются.
Не используйте и поля iMaxSockets и iMaxUdpDg. Предполагается, что в них заданы максимальное количество одновременно открытых сокетов и максимальный размер дейтаграммы. Максимальное количество одновременно открытых сокетов зависит от свободной физической памяти. Наконец, поле lpVendorlnfo зарезервировано для информации изготовителя реализации Winsock и не используется ни на одной из платформ Win32.
Для использования в приложении Winsock 1 необходимо подключить файл Winsock.h, а для Winsock 2 — Winsock2.h.
Даже если платформа поддерживает Winsock 2, не обязательно использовать самую последнюю версию. Напротив, если необходимо, чтобы приложение поддерживалось несколькими платформами, возьмите за основу Winsock 1.1. Такое приложение будет отлично работать на платформе Windows NT 4-0, потому что все вызовы Winsock 1.1 имеются в Winsock 2 DLL.
Как правило, если выходит новая версия Winsock, разработчики стараются ее обновить. В новых версиях исправлены ошибки, к тому же старый код должен без проблем выполняться, по крайней мере, теоретически. В некоторых случаях поведение Winsock отличается от определенного спецификацией. В итоге многие программисты пишут приложения с учетом работы Winsock на конкретной платформе, а не согласно спецификации.
В большинстве случаев при написании новых приложений следует загружать последнюю доступную версию библиотеки Winsock. Если будет выпущена версия 3, приложение, использующее версию 2.2, должно выполняться корректно. При запросе более поздней версии Winsock, не поддерживаемой вашей платформой, WSAStartup вернет ошибку, а в поле wHighVersion структуры WSADATA появится номер последней версии библиотеки, поддерживаемой данной системой.
Дата добавления: 2014-12-19; просмотров: 104 | Поможем написать вашу работу | Нарушение авторских прав |