Лабораторна робота №4. Передача повідомлень на базі бібліотеки Winsock 1 Постановка завдання icon

Лабораторна робота №4. Передача повідомлень на базі бібліотеки Winsock 1 Постановка завдання




Скачати 189.43 Kb.
НазваЛабораторна робота №4. Передача повідомлень на базі бібліотеки Winsock 1 Постановка завдання
Дата21.02.2014
Розмір189.43 Kb.
ТипЛабораторна робота
1. /1 Лабораторна робота.doc
2. /2 Лабораторна робота.doc
3. /3 Лабораторна робота.doc
4. /4 Лабораторна робота.doc
Лабораторна робота №4. Передача повідомлень на базі бібліотеки Winsock 1 Постановка завдання
Лабораторна робота №3. Обмін повідомленнями на базі мережних компо нентів Delphi 1 Постановка завдання Використовуючи стандартні компоненти середовища Delphi Tclientsocket
Лабораторна робота №2. Основи діагностики мережі 1 Постановка завдання
1 Лабораторна робота №1 Дослідження витої пари



4 Лабораторна робота №4. Передача повідомлень на базі бібліотеки

Winsock


4.1 Постановка завдання


Реалізувати клієнт – серверний програмний продукт у середовищі Delphi,

для обміну текстовими повідомленнями в рамках протоколу TCP/IP під ОС Win-

dows 9x/NT/2000 на базі функцій бібліотеки Winsock.


4.2 Коротка теоретична довідка


Winsock або Windows socket - це інтерфейс прикладного програмування (API), створений для реалізації програм у мережі на основі протокола TCP/IP. Для роботи використовується WSOCK32.DLL. Ця бібліотека знаходиться в папці \System32 системного каталогу Windows.

Існують дві версії Winsock:

Winsock 1.1 - підтримує тільки протокол TCP/IP;

Winsock 2.0 - підтримує додаткове програмне забезпечення.

Winsock 1.1 дав поштовх до розвитку World Wide Web і дозволив одержати

доступ в Internet звичайному користувачеві ПК під Windows. Якщо ціль версії

1.1 полягала в розв'язку проблеми, те ціль Winsock 2.0 - зробити мережне середовище

краще, швидше й надійніше. В Winsock 2.0 додана підтримка інших транспортних

протоколів і нові функціональні можливості забезпечення надійності мережного обміну інформацією. Winsock 2.0 дозволяє створювати незалежні від транспортних протоколів

програми, що працюють із TCP/IP(Transmission Control Protocol/Internet Protocol),

UDP (User Datagram Protocol),IPX/SPX (Internetwork Packet Exchange/Sequenced Packet Exchange), Netbeui(Netbios Extended User Interface). Більша ефективність таких програм

досягається за рахунок сполученого введення/виводу й розподілених сокетів.

Специфікація Winsock розділяє функції на три типи:

- блокувальні й неблокувальні (функції Беркли);

- інформаційні (одержання інформації про найменування доменів,

службах, протоколах Internet);

- ініціалізації й деініціалізації бібліотеки.

Блокувальна – це функція, яка припиняє роботу програми

до свого завершення; неблокувальна – це функція, яка виконується па-

ралельно із програмою. Список основних функцій, необхідних для створення програми, наведено в таблицях 1, 2, 3. Усі описи функцій Winsock

дані у форматі мови З, а приклади їх виклику – на Delphi.

Таблиця 1 – Блокувальні функції (функції Беркли)


1


Назва функції

Closesocket


2


Призначення

Закриває одну зі сторін з'єднання

Створює новий сокет і підключає його до вилученого комп'ютера


Accept





Продовження таблиці 1


Connect


Recfrom

Send

1

2

Ініціалізує з'єднання з боку зазначеного сокета

Ухвалює дані від підключеного сокета

Ухвалює дані від підключеного або непідключеного сокета

Посилає дані підключеному сокету

Посилає дані підключеному або непідключеному сокету


Таблиця 2 – Неблокувальні функції (функції Беркли)

Назва функції


Inet_addr


Ioctlsocket

Listen

Socket

Призначення

Зв'язує віртуальний сокет з фізичним

Конвертує рядок у значення, яке можна використовувати в

структурі in_addr:

Управляє параметрами сокета

Переводить сокет у режим прослуховування порту.

Створює точку з'єднання


Таблиця 3 – Функції ініціалізації й деініціалізаціі бібліотеки Winsock

Назва функції

Wsacleanup

Wsagetlasterror

Wsasetlasterror

Wsastartup

Призначення

Припиняє роботу з Winsock DLL

Одержує інформацію про останню помилку

Установлює повернення після помилки

Ініціалізує Winsock DLL


4.3 Схема взаємодії функцій Winsock


Блок 1


WSASTARTUP


SOCKET


BIND


Блок 3


LISTEN


Блок 2


CONNECT


SENDTO


Створення віртуального каналу


Запит


ACCEPT


RECV


ОБРОБКА ЗАПИТУ


RECV


Відгук


SEND


Блок 4


Малюнок 3 – Схема взаємодії функцій Winsock


Для реалізації поставленого завдання необхідно створити клієнтську й

серверну програму. Вони різні по організації, але є загальні дії,


21



Recv

Sendto

Bind




необхідні як для клієнтської, так і для серверної частини. Схема взаємодії

функцій Winsock відбито на малюнку 3. У блоці 1 малюнка відображені

загальні дії сервера й клієнта, у блоках 2 і 3, відповідно, дії

сервера й клієнта, а в блоці 4 – їх взаємодія.

Для того, щоб використовувати функції Winsock, необхідно завантажити

бібліотеку Wsock32.dll. Як видно із блоку 1 малюнка 3, це здійснюється

функцією Wsastartup [див. 3.7.1]. При успішному завантаженні бібліотеки, потрібно створити сокет, використовуючи функцію Socket [див. 3.7.2] і асоціювати сокет з адресною структурою Sockaddr_In [див. 3.7.3], яка містить інформацію про протокол з'єднання,

Ip-Адресу й порт ПК.


4.4 Реалізація клієнтської частини


Після створення клієнтського сокета, він надсилає запит на підключення

до сервера, використовуючи функцію connect [див. 3.7.5], указавши в якості одного з

параметрів Ip-Адресу сервера. Ця функція є блокувальної, тобто виконання

програми призупиниться доти, поки не прийде відповідь від сервера.

При позитивній відповіді сокет підключається до сервера й може з ним взаємодіяти.

Реалізація клієнтської частини представлено в блоці 3 малюнка 1.


4.5 Реалізація серверної частини


Після загальних дій, відповідно до блоку 2 малюнка 1, сервер

прослуховує порт функцією listen [див. 3.7.4], тобто перевіряє його на предмет за-

питу від клієнта. Після вступу запиту, сервер обробляє його функ-

цією accept [див. 3.7.4], тобто сервер приєднує клієнта, створюючи новий сокет.

Створений сокет виступає в якості посередника між клієнтом і сервером,

тобто “спілкування” відбувається через новий сокет і навпаки.


4.6 Реалізація обміну даними


У блоці 4 малюнка 1 відбитий процес взаємодії між клієнтом і

сервером, який зводиться до відправлення й приймання повідомлень. Для відправлення повідомлення використовується функція send або sendto [див. 3.7.6]. Їхня відмінність полягає

у тому, що для функції send необхідне з'єднання (connect, accept), для

sendto воно необов'язково. Для приймання повідомлень застосовують функції recv або

recvfrom [див. 3.7.6]. Для функції recvfrom з'єднання (connect, accept) також

необов'язково.


4.7 Бібліотека Winsock і її функції


4.7.1 Ініціалізація Winsock


Функція Wsastartup ініціалізує бібліотеку Winsock. Вона завжди

запускається першою при початку роботи з Winsock. Приведемо її опис:


22


int Wsastartup (WORD wversionrequested, LPWSADATA lpwsadata).


Перший параметр - це версія, яка буде використовуватися. Молодший

байт основна версія, старший байт розширення версії. Якщо ініціалізація

відбулася, то повернеться нульове значення. Ініціалізація полягає в зіставленні номера версії й реально існуючої DLL у системі.

Другий параметр - це покажчик на структуру WSADATA, у яку

вернуться параметри ініціалізації:

typedef struct Wsadata {

WORD

WORD


unsigned short

unsigned short

char FAR *

wversion;

whighversion;

szdescription[WSADESCRIPTION_LEN+1];

szsystemstatus[WSASYS_STATUS_LEN+1];

imaxsockets;

imaxudpdg;

lpvendorinfo;

} WSADATA, FAR * LPWSADATA;

Wsacleanup завершує використання даного DLL і перериває звертання до функцій Winsock.

При вдалім виконанні повернеться нуль.


Приклад ініціалізації бібліотеки Winsock:

Var

Mywsadata : WSADATA;

Errwsadata : integer;

Begin

Errwsadata := Wsastartup(Makeword(2, 0), Mywsadata);

If (Errwsadata <> 0) then

Showmessage(‘Бібліотека не була ініціалізована’)

Else

// Ваші подальші дії

End;


4.7.2 Створення й видалення сокета


Функція створення сокета має такий вигляд:


SOCKET socket(int af, int type, int protocol),


де af - характеризує набір протоколів, у рамках якого будуть взаємодіяти

клієнт і сервер (це може бути TCP/IP, UDP, IPX і

т.д.). Для протоколу TCP/IP параметр af повинен бути рівний AF_INET,

що відповідає формату адреси, прийнятої в Internet.

type - визначає тип комунікацій (SOCK_STREAM, і

SOCK_DGRAM). Якщо даний параметр рівний SOCK_STREAM, то па-


23
char

char




кет буде використаний для передачі даних через канал зв'язку з використанням

протоколу TCP/IP. Якщо ж використовується SOCK_DGRAM, то

передача даних буде виконуватися без створення каналів зв'язку через

датаграмний протокол UDP,

protocol - задає код конкретного протоколу із зазначеного набору ( за-

даного af), який буде реалізований у данім з'єднанні. Протоколи

позначаються символьними константами із префіксом IPPROTO_ (на-

приклад, IPPROTO_IP або IPPROTO_UDP). Допускається значення

protocol=0 (протокол не зазначений), у цьому випадку використовується значення за

замовчанням для даного виду з'єднань.

параметр, що вертається, являє собою дескриптор з'єднувача.

Якщо операція socket завершилася успішно, вихідний параметр рівний

дескриптору з'єднувача, а якщо ні, то - INVALID_SOCKET (-1). За допо-

могою оператора Wsagetlasterror можна одержати код помилки, який з`ясовує причину негативного результату.

Знищує сокет функція:


closesocket(SOCKET s),


де s - змінна типу Tsocket, отримана в результаті виклику функ-

ції Socket.

Приклад створення сокета:

Var

Mysokcet : Tsocket;

begin

Mysocket := socket(AF_INET, SOCK_STREAM, IPPROTO_IP);

If (Mysocket = INVALID_SOCKET) then

Showmessage(‘Сокет не створений’)

Else

// Ваші подальші дії

End.


4.7.3 Прив'язка адреси до сокету


Функція зв'язування сокета з фізичною адресою має вигляд:


Int bind(SOCKET s, const struct socketaddr FAR* name, int namelen),


де s - код дескриптора;

name - містить три величини: Ip-Адреса, код протокольного набору, який визначає характер програми;

namlen - визначає довжину другого параметра.

Структура адресної інформації має вигляд:

struct sockaddr_in{

short sin_family; {Вказується протокол}


24


unsigned short sin_port;{Вказується порт}

struct in_addr sin_addr;{Вказується Ip-Адреса}

char sin_zero[8]};


У серверній частині програми Ip-Адресу можна зробити рівною

INADDR_ANY (або =0), тому що серверу не обов'язково знати свою Ip-Адресу. При

коректнім виконанні функція bind повертає код 0, а якщо ні, то

SOCKET_ERROR=-1.


Приклад:

Var

Mysockaddr : Tsockaddr_In;

Errbind : integer;

begin

Mysockaddr.sin_family := AF_INET;

Mysockaddr.sin_port := htons(1024);

Mysockaddr.sin_addr.s_addr := INADDR_ANY;

Errbind := bind(Mysock, Mysockaddr, Sizeof(Mysockaddr));

If (Errbind <> 0) then

Showmessage(‘Помилка зв'язування адреси із сокетом’)

Else // Ваші подальші дії

end.


4.7.4 Очікування й обробка запитів на підключення клієнта


Для того, щоб сокет очікував підключення, його необхідно перевести в стан,

що очікує, за допомогою функції listen:


int listen(SOCKET s, int backlog),


де backlog - задає максимальний розмір черги для вхідних за-

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

без втрат. Сокет, що очікує, посилає кожному відправникові повідомлення-

відгук одержання, що підтверджує запит на з'єднання.

Запити із черги, сформованою функцією listen, обробляються

функцією accept, що встановлює зв'язок із сокетом клієнта:


int accept(SOCKET s, struct sockaddr FAR*addr, int FAR*addrlen),


де s - дескриптор з'єднувача, який прослуховує з'єднання (той

же, що й в listen);

addr - покажчик на структуру, яка містить адресу;

addrlen – покажчик на довжину адреси addr.

При виникненні помилки вертається код INVALID_SOCKET.


25


Приведемо приклад використання функцій linsten і accept:

Var

Acceptsocket : Tsocket;

Acceptaddr : Sockaddr_In;

Sizeacceptaddr : Integer;

Errlisten : integer;

Begin

Errlisten := listen(Mysock, 5);

If (Errlisten <> 0) then

Showmessage(‘Черга для запитів

не зформована’)

Else Begin

Acceptsocket := accept(Mysock, @Acceptaddr, @Sizeacceptaddr);

If (Acceptsocket = INVALID_SOCKET) then

Showmessage(‘Клієнт не приєднався’)

else

// Ваші подальші дії

End;

End.


4.7.5 Підключення до сервера


Клієнт для з'єднання із сервером повинен використовувати функцію con-

nect:


int connect(SOCKET s, const struct socketaddr FAR* name, int namelen),


де s - дескриптор сокета;

name - ідентифікатор адреси місця призначення (покажчик на структуру

даних);

namelen - довжина цієї адреси.

Таким чином, функція connect повідомляє Ip-Адресу й номер порту

віддаленій машині. Якщо адресне поле структури name містить нулі,

функція

connect

поверне

помилку

WSAEADDRNOTAVAIL

(або

SOCKET_ERROR=-1).

Спроба підключення до сервера описана в наступному прикладі:

Var

Clientsocket : Tsocket;

Serveraddr : Sockaddr_In;

Errconnect : integer;

begin

Serveraddr.sin_family := AF_INET;

Serveraddr.sin_port := htons(1024);

Serveraddr.sin_addr.s_addr := inet_addr(< Ip-Адреса сервера>);

Errconnect := connect(Clientsocket, Serveraddr, Sizeof(Serveraddr));

If (Errconnect <> 0) then


26



Showmessage(‘Не можу підключитися до сервера’)

Else

// Ваші подальші дії

end.


4.7.6 Відправлення й приймання повідомлень


Для відправлення повідомлень використовується функція send або sendto:


int send (SOCKET s, const char FAR* buf, int len, int flags),


де s – дескриптор сокета на віддаленій машині;

buf – покажчик на масив символів, що підлягають пересиланню;

len – розмір другого параметра;

flgas - служить для цілей діагностики й керування передачею даних.

Рекомендується дорівнювати його нулю.


Приклад розсилання повідомлень оператором send:

Var

Buf : array [0..255] of char;

Errsend : integer;

Begin

Errsend := send(Acceptsocket, Buf, Sizeof(Buf), 0);

If (Errsend = SOCKET_ERROR) then

Showmessage(‘Помилка передачі даних’)

Else

// Ваші подальші дії

End.


Функція sendto служить для пересилання даних без установки з‘єднання, тобто відправлення даних іде без підтвердження одержання даних:


int sendto (SOCKET s, const char FAR* buf, int len, int flags, const struct

sockaddr FAR* to, int tolen);


де s – дескриптор відправника;

buf – покажчик на масив даних, призначених для пересилання;

len – розмір другого параметра;

flags - служить для цілей діагностики й керування передачею даних;

to – адресна структура сокета віддаленої машини;

tolen – розмір адресної структури сокета віддаленої машини.


Приклад посилки повідомлень функцією sendto:

Var

Buf : array [0..255] of char;


27


Mysocket : Tsocket;

Sendtoaddr : Sockaddr_In;

Errsendto : ineteger;

Begin

Errsento := sendto(Mysocket, Buf, Sizeof(Buf), 0, Sendtoaddr,

Sizeof(Sendtoaddr));

If (Errsendto = SOCKET_ERROR) then

Showmessage(‘Помилка передачі даних’)

Else

// Ваші подальші дії

End.


Для приймання повідомлення застосовується функція recv або recvfrom. Функ-

цію recvfrom так само, як і sendto, можна застосовувати, не з'єднуючись із відправником.


int recv (SOCKET s, char FAR* buf, int len, int flags);


де s – дескриптор сокета одержувача;

buf – покажчик на масив отриманих даних;

len – розмір другого параметра;

flags - служить для цілей діагностики й керування передачею даних.


Приклад приймання повідомлень функцією recv:

Var

Buf : array [0..255] of char;

Mysock : Tsocket;

Errrecv : integer;

Begin

Errrecv := recv(Mysock, buf, Sizeof(Buf), 0);

If (Errrecv = SOCKET_ERROR) then

Showmessage(‘Не можу прийняти повідомлення’)

Else

// Ваші подальші дії

End.


int recvfrom (SOCKET s, const char FAR* buf, int len, int flags, const

struct sockaddr FAR* to, int tolen);


де s – дескриптор одержувача;

buf – покажчик на масив отриманих даних;

len – розмір другого параметра;

flags - служить для цілей діагностики й керування передачею даних;

to – адресна структура сокета віддаленої машини;

tolen – розмір адресної структури сокета віддаленої машини.


28


Приклад приймання повідомлень, використовуючи функцію recvfrom:

Var

Buf : array [0..255] of char;

Mysocket : Tsocket;

Recvfromaddr : Sockaddr_In;

Errrecvfrom : ineteger;

Begin

Errrecvfrom := recvfrom(Mysocket, Buf, Sizeof(Buf), 0, Recvfro-

maddr, Sizeof(Recvfromaddr));

If (Errrecvfrom = SOCKET_ERROR) then

Showmessage(‘Не можу прийняти повідомлення’)

Else

// Ваші подальші дії

End.


4.8 Рекомендації з виконання роботи


Приведемо кілька порад для спрощення створення програми.

Функції accept, connect, recv є блокувальними, тобто виконання про-

грами затримується на якийсь час, протягом якого не можна виконувати

ніякі дії. Ви будете користуватися таким чатом, коли під час

очікування повідомлення програма зависає? Рекомендуємо всі блокувальні

функції вивести в окремі потоки (Tthread), що працюють паралельно з

програмою програми, що й не приводять до зависання. У клієнтській частині

можна винести в окремий потік прослуховування порту на предмет одержання

даних від сервера й обробку одержуваних даних. У серверній частині, створити

кілька потоків, що містять у собі функцію accept; при одержанні запиту

на підключення, створюється ще один потік, що виконує постійне прослу-

ховування порту на предмет передачі даних знову підключеного клієнта. Та-

ким чином, у серверній частині маємо n+1 потік, де n-кількість клієнтів.


4.9 Контрольні запитання


1. Підтримувала чи Winsock 1.1 протокол UDP?

2. Чи Вірно твердження, що функція accept є неблокувальної?

3. Що виконує функція bind?

4. Виправте помилку: Socket(Mysock, IPPROTO_IP, SOCK_STREAM); .

5. Опишіть загальні дії сервера й клієнта.

6. Що означає наступний запис: Сonnect(Socket1, Addr1, Sizeof(Addr1));?

7. Що необхідно зробити, щоб створити серверний сокет?

8. Для чого використовуються потоки?

Схожі:

Лабораторна робота №4. Передача повідомлень на базі бібліотеки Winsock 1 Постановка завдання iconЛабораторна робота №7 Постановка задачі
Задана дискретна лінійна стаціонарна детермінована математична модель з простором станів
Лабораторна робота №4. Передача повідомлень на базі бібліотеки Winsock 1 Постановка завдання iconЛабораторна робота №4 Постановка задачі
Дискретні моделі з простором станів, отримані в завданні 3 дослідити на керованість, спостережуваність та асимптотичну стійкість
Лабораторна робота №4. Передача повідомлень на базі бібліотеки Winsock 1 Постановка завдання iconЛабораторна робота №16 : “ms ассеss. Робота з фільтрами І запитами”
Мета роботи: Уміти конструювати фільтри І запити для відшукання даних у базі даних. Знати різницю між запитами: на вибірку, пара­метричними,...
Лабораторна робота №4. Передача повідомлень на базі бібліотеки Winsock 1 Постановка завдання iconДокументи
1. /ЛАБОРАТОРНА РОБОТА ь1.doc
2. /ЛАБОРАТОРНА...

Лабораторна робота №4. Передача повідомлень на базі бібліотеки Winsock 1 Постановка завдання iconДокументи
1. /Лабораторн_ роботи гр. 721/Вх_дний контрол з ЛАБ. РОБ. Ф_ЗИКА.doc
2. /Лабораторн_...

Лабораторна робота №4. Передача повідомлень на базі бібліотеки Winsock 1 Постановка завдання iconДокументи
1. /Лабораторн_ роботи гр. 721/Вх_дний контрол з ЛАБ. РОБ. Ф_ЗИКА.doc
2. /Лабораторн_...

Лабораторна робота №4. Передача повідомлень на базі бібліотеки Winsock 1 Постановка завдання iconЛабораторна робота №1 Токар Артем пм-91 Варіант №9 Завдання 1
Де A11 – стовпець з нулів, A12 одинична матриця, A21 -а1, A22 а2, ап
Лабораторна робота №4. Передача повідомлень на базі бібліотеки Winsock 1 Постановка завдання iconВизначення змісту міжкультурної комунікації на основі філософської категорії „досвід” Постановка проблеми
Постановка проблеми. Головна мета системи вищої освіти – передача накопиченого попередніми поколіннями досвіду; пріоритетними завданнями...
Лабораторна робота №4. Передача повідомлень на базі бібліотеки Winsock 1 Постановка завдання iconЛабораторна робота з дисципліни " Назва дисципліни " на тему " Тема домашнього завдання " Напрям: 070102 "Аеронавігація" Спеціальність

Лабораторна робота №4. Передача повідомлень на базі бібліотеки Winsock 1 Постановка завдання iconТема Група
Розробка програми аудіо повідомлень для коледжу (бд повідомлень: про небезпеку, інформаційні, І т. І.)
Лабораторна робота №4. Передача повідомлень на базі бібліотеки Winsock 1 Постановка завдання iconТема Група
Розробка програми аудіо повідомлень для коледжу (бд повідомлень: про небезпеку, інформаційні, І т. І.)
Додайте кнопку на своєму сайті:
Документи


База даних захищена авторським правом ©zavantag.com 2000-2013
При копіюванні матеріалу обов'язкове зазначення активного посилання відкритою для індексації.
звернутися до адміністрації
Документи