Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабы Мартын 2(NPWSLab2U07).doc
Скачиваний:
6
Добавлен:
10.02.2016
Размер:
384 Кб
Скачать

1.1. Сокети, датаграми й канали зв'язку

У локальних і глобальних мережах існує два принципово різних способи передачі даних.

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

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

Для передачі даних з використанням кожного з перерахованих вище способів кожний додаток повинне створити об'єкт, що називається сокетом.

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

Для сокету необхідно вказати три параметри. Це IP адреса, пов'язаний із сокетом, номер порту, для якого будуть виконуватися операції передачі даних, а також тип сокету. Існують сокети двох типів. Перший тип призначений для передачі даних у вигляді датаграмм, другий - з використанням каналів зв'язку.

1.1.1. Ініціалізація додатка й завершення його роботи

Перед викликом будь-якої функції Winsock необхідно завантажити правильну версію бібліотеки Winsock. Функція ініціалізації Winsock - WSAStartup:

int WSAStartup(WORD wVersionRequested, LPWSADATA lpWSAData);

Перший параметр - версія бібліотеки Winsock, яку необхідно завантажити. Для завантаження версії Winsock 2.2 треба вказати значення 0x0202, або макрос MAKEWORD(2, 2). Верхній байт визначає додатковий номер версії, нижній - основний.

Другий параметр - структура WSADATA, що повертає по завершенні виклику. Вона містить інформацію про версії Winsock, завантаженою функцією 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 FAR * lpVendorInfo;

} WSADATA, FAR * LPWSADATA;

Корисна інформація, що повертає в структурі WSADATA - поля wVersion і wHighVersion. Поля, що ставляться до максимальної кількості сокетів і максимальному розміру UDP, варто одержувати із запису каталогу для конкретного протоколу.

Індивідуальні поля структури WSADATA такі:

wVersion - версія Winsock, що припускає використати виклик;

wHighVersion - вища версія Winsock, підтримувана завантаженою бібліотекою (як правило, те ж значення, що й wVersion);

szDescription - текстовий опис завантаженої бібліотеки;

szSystemStatus - текстовий рядок з відповідною інформацією про стан або конфігурацію;

iMaxSockets - максимальна кількість сокетів (пропустите це поле для Winsock 2 і більше пізніх версій);

iMaxUdpDg - максимальний розмір Дейтаграми UDP;

lpVendorInfo - інформація про виготовлювача (пропустити це поле для Winsock 2 і більше пізніх версій).

По завершенні роботи з бібліотекою Winsock варто викликати функцію WSACleanup для вивантаження бібліотеки й звільнення ресурсів:

int WSACleanup (void);

Для кожного виклику WSAStartup необхідно узгоджено викликати WSACleanup, тому що кожний стартовий виклик збільшує значення еталонного лічильника посилань на завантажені Winsock DLL. Щоб зменшити значення лічильника, потрібне рівна кількість викликів WSACleanup.

BOOL CServerSocketDlg::Init()

{

int rc;

WSADATA WSAData;

char szTemp[128];

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

if(rc != 0)

{

MessageBox("WSAStartup Error", "Error", MB_OK);

return FALSE;

}

wsprintf(szTemp, "Server use %s %s",

WSAData.szDescription,WSAData.szSystemStatus);

SetWindowText( szTemp );

return TRUE;

}

void CServerSocketDlg::OnClose()

{

WSACleanup();

CDialog::OnClose();

}