Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
metod seti.doc
Скачиваний:
2
Добавлен:
01.04.2025
Размер:
306.18 Кб
Скачать
  1. Программирование по схеме “клиент-сервер” с использованием интерфейса Windows Sockets

В локальных и глобальных сетях существуют два принципиально разных способа передачи данных. Первый из них предполагает посылку данных от одного узла к другому (или сразу нескольким узлам) без получения подтверждения о доставке и даже без гарантии того, что передаваемые пакеты будут получены в правильной последовательности. Примером такого протокола служит UDP, который используется в сетях TCP/IP, или протокол IPX, который является базовым в сетях Novell NetWare. Основные преимущества дейтаграммных протоколов заключаются в высоком быстродействии и возможности широковещательной передачи данных, когда один узел отправляет сообщения, а несколько других их получают, причём одновременно.

Второй способ передачи предполагает создание канала передачи данных между двумя различными узлами сети. При этом канал создаётся средствами дейтаграммных протоколов, однако доставка пакетов в канале является гарантированной. Пакеты всегда доходят в целостности и сохранности (по крайней мере до прикладного уровня протокола), причём в правильном порядке. Быстродействие получается в среднем ниже, чем у дейтаграммных протоколов, за счёт посылки подтверждений. Примерами протоколов, использующих канал связи, могут служить протоколы TCP и SPX (протокол NETBIOS допускает передачу данных с использованием как дейтаграмм, так и каналов связи). В данном приложении для передачи тестовых данных используется протокол пользовательских дейтаграмм UDP, так как он не гарантирует доставки пакетов, и следовательно годится для тестирования сетей.

Для передачи данных с помощью любого из вышеперечисленных двух способов каждое приложение должно создать объект, называемый сокетом. По своему назначению сокет больше всего похож на идентификатор файла (file handle), который нужен для выполнения над файлом операций чтения или записи. Прежде чем приложение, запущенное на узле сети, сможет выполнять передачу или приём данных, оно должно создать сокет и проинициализировать его, указав некоторые параметры. Для сокета необходимо указать три параметра. Это IP адрес, связанный с сокетом, номер порта, для которого будут выполняться операции передачи данных, а так же тип сокета. Что касается последнего параметра (тип сокета), то существуют сокеты двух типов. Первый тип предназначен для передачи данных в виде дейтаграмм, второй – с использованием каналов связи.

Инициализация приложения и завершение его работы.

В процессе инициализации приложение должно зарегистрировать себя в библиотеке winsock32.dll, которая предоставляет приложениям интерфейс Windows Sockets в среде операционных систем MS Windows9x и MS Windows NT.

Для инициализации необходимо вызвать функцию WSAStartup, определённую следующим образом:

Int wsaStartup(word wVersionRequested, lpwsadata lpWsaData);

В параметре wVersionRequested указывается версия интерфейса WS, необходимая для работы данного приложения. Старший байт указывает младший номер версии (minor version), младший байт – старший номер версии (major version).

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

Если происходит ошибка, возвращается одно из следующих значений:

Значение

Описание

WSASYSNOTREADY

Сетевое программное обеспечение не готово для работы

WSAVERNOTSUPPORTED

Функция не поддерживается данной реализацией интерфейса Windows Sockets

WSAEINVAL

Библиотека dll, обеспечивающая интерфейс Windows Sockets, не соответствует версии, указанной приложением в параметре wVersionRequested

Фрагмент текста программы, выполняющий инициализацию интерфейса Windows Sockets:

#include <winsock2.h>

…………………………..

Rc=WSAStartup(MAKEWORD(2,0), &WSAData);

if(rc != 0) {

mMessageBox(NULL, “WSAStartup Error”, “Error”, MB_OK);

return FALSE;

}

//Отображаем описание и версию системы Windows Sockets в

//окне органа управления StatusBar

wsprintf(szTemp,“Server use %s

%s”,WSAData.szDescription,WSAData.szSystemStatus);

hwndSb = CreateStatusWindow(WS_CHILD | WS_VISIBLE | WS_BORDER | SBARS_SIZEGRIP, szTemp, hWnd, IDS_STATUSBAR);

Определение структуры WSADATA и указателя на неё выглядит следующим образом:

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 FAR * lpVendorInfo;

} WSADTA;

typedef WSADATA FAR *LPWSADATA;

Использованные выше поля szDescription и szSystemStatus после вызова функции WSAStartup содержат соответственно описание конкретной реализации интерфейса Windows Sockets и текущее состояние этого интерфейса в виде текстовых строк. В полях wVersion и wHighVersion записаны соответственно версия спецификации Windows Sockets, которую будет использовать приложение, и версия спецификации, которой соответствует конкретная реализация интерфейса Windows Sockets. Приложение может создавать одновременно несколько сокетов, например для использования в различных подзадачах одного процесса. В поле iMaxSockets хранится максимальное количество сокетов, которое можно получить для одного процесса. В поле iMaxUdpDg записан максимальный размер пакета данных, который можно делать с использованием дейтаграмного протокола UDP. Поле lpVendorInfo содержит указатель на дополнительную информацию, формат которой зависит от фирмы – изготовителя конкретной реализации системы Windows Sockets.

Перед тем, как завершить свою работу, приложение должно освободить ресурсы, полученные у операционной системы для работы с Windows Sockets. Для выполнения этой задачи приложение должно вызвать функцию WSACleanup, определённую так, как это показано ниже:

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