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

63

Министерство образования и науки Российской Федерации

Казанский государственный технический университет

имени А.Н. Туполева

____________________________________________________

Межкафедральный филиал факультета № 4 в ОАО ICL-КПО ВС

Р.Ф. Миннибаев

Методическое руководство к

лабораторной работе

“ Windows сокеты ”

по дисциплине “Системное программирование”

Казань 2004

Содержание

1. Сокеты, датаграммы и каналы связи 3

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

3. Создание и инициализация сокета 5

3.1. Создание сокета 5

3.2. Удаление сокета 6

3.3. Параметры сокета 6

3.4. Привязка адреса к сокету 8

3.5. Создание канала связи 9

3.5.1.Сторона сервера 9

3.5.1. Сторона клиента 11

3.5.3. Передача и прием данных 12

4. Решения при работе с сокетами 14

5. Порядок выполнения работы 15

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

Приложения 16

1. Коды ошибок различных функций при работе с сокетами 16

2. Сервер сокетов с оконным интерфейсом (протокол TCP/IP). 20

3. Клиент сокетов с оконным интерфейсом (протокол TCP/IP). 28

4. Сервер сокетов с оконным интерфейсом (протокол UDP). 34

5. Клиент сокетов с оконным интерфейсом (протокол UDP). 41

6. Сервер неблокирующих сокетов с использованием события WSAEVENT (протокол TCP/IP) 47

7. Клиент неблокирующих сокетов с использованием события WSAEVENT (протокол TCP/IP) 50

8. Сервер неблокирующих сокетов с использованием функции select 53

9.Клиент неблокирующих сокетов с использованием функции select 56

10. Сервер блокируюющих сокетов (протокол TCP/IP) 59

11. Клиент блокируюющих сокетов (протокол TCP/IP) 61

1. Сокеты, датаграммы и каналы связи

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

Первый из них предполагает посылку пакетов данных от одного узла другому (или сразу нескольким узлам) без получения подтверждения о доставке и даже без гарантии того, что передаваемые пакеты будут получены в правильной последовательности. Примером такого протокола может служить протокол UDP (User Datagram Protocol ), который используется в сетях TCP/IP, или протокол IPX , который является базовым в сетях Novell NetWare .

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

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

Для передачи данных с использованием любого из перечисленных выше способов каждое приложение должно создать объект, который называется сокетом.

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

Для сокета необходимо указать три параметра. Это IP адрес, связанный с сокетом, номер порта, для которого будут выполняться операции передачи данных, а также тип сокета.

Что касается последнего параметра (тип сокета), то существуют сокеты двух типов. Первый тип предназначен для передачи данных в виде датаграмм, второй - с использованием каналов связи.

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

В процессе инициализации приложение должно зарегистрировать себя в библиотеке WSOCK32.DLL , которая предоставляет приложениям интерфейс Windows Sockets в среде операционных систем Microsoft Windows 95 и Microsoft Windows NT.

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

int WSAStartup (WORD wVersionRequested, LPWSADATA lpWSAData);

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

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

В случае успеха функция WSAStartup возвращает нулевое значение. Если происходит ошибка, возвращается одно из следующих значений (см. Приложения. Таблица 1.)

Ниже мы представили фрагмент исходного текста приложения SERVER, которое будет описано ниже, выполняющий инициализацию интерфейса Windows Sockets:

rc = WSAStartup (MAKEWORD(1, 1), &WSAData);

if(rc != 0)

{

MessageBox(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);

В операционных системах Microsoft Windows 95 и Microsoft Windows NT версии 3.51 встроена система Windows Sockets версии 1.1, поэтому именно это значение мы указали при вызове функции WSAStartup .

В следующих нескольких строках только что приведенного фрагмента кода содержимое двух полей структуры типа WSADATA отображается в окне органа управления 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;

} WSADATA ;

typedef WSADATA FAR *LPWSADATA;

Использованные выше поля szDescription и szSystemStatus после вызова функции WSAStartup содержат, соответственно, описание конкретной реализации интерфейса Windows Socket и текущее состояние этого интерфейса в виде текстовых строк.

В полях wVersion и wHighVersion записаны, соответственно, версия спецификации Windows Socket, которую будет использовать приложение, и версия спецификации, которой соответствует конкретная реализация интерфейса Windows Socket.

Приложение может одновременно создавать несколько сокетов, например, для использования в разных подзадачах одного процесса. В поле iMaxSockets хранится максимальное количество сокетов, которое можно получить для одного процесса.

В поле iMaxUdpDg записан максимальный размер пакета данных, который можно переслать с использованием датаграммного протокола UDP .

И, наконец, поле lpVendorInfo содержит указатель на дополнительную информацию, формат которой зависит от фирмы-изготовителя конкретной реализации системы Windows Sockets.

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

int WSACleanup (void);

Эта функция может возвратить нулевое значение при успехе или значение SOCKET_ERROR в случае ошибки.

Для получения кода ошибки вы должны воспользоваться функцией с именем WSAGetLastError :

int WSAGetLastError (void);

Функция WSAGetLastError позволяет определить код ошибки при неудачном завершении практически всех функций интерфейса Windows Sockets. Вы должны вызывать ее сразу вслед за функцией, завершившейся неудачно.

Если ошибка возникла при выполнении функции WSACleanup, функция WSAGetLastError может вернуть одно из следующих значений (см. Приложения):

Сделаем небольшие пояснения относительно последней ошибки, приведенной в этом списке, и имеющей код WSAEINPROGRESS .

Некоторые функции интерфейса Windows Sockets способны блокировать работу приложения, так как они не возвращают управление до своего завершения. В операционных системах, использующих вытесняющую мультизадачность, к которым относятся Microsoft Windows 95 и Microsoft Windows NT, это не приводит к блокировке всей системы. Как вы увидите дальше, можно избежать использования блокирующих функций, так как для них в интерфейсе Windows Sockets существует замена.

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