Читайте также: |
|
Лабораторна робота № 6.
Тема: Мережеве програмування за допомогою сокетів у Windows.
Мета: Навчитись створювати мережеві програми за допомогою сокетів на прикладі чату між двома користувачами.
Теоретичні відомості.
Технологія "сокетів" (sockets - гніздо, роз'єм) розроблена для підтримки мережевої взаємодії програм. 3 точки зору програмування сокет - це програмний інтерфейс для забезпечення обміну даними між процесами (які можуть працювати на одному чи різних комп'ютерах). Він є моделлю одного кінця з'єднання з характерними йому властивостями й методами.
В Windows підтримка сокетів включена у бібліотеку WinSock.
Мережеві програми побудовані на технології клієнт-сервер, згідно з якою в мережі існує принаймні одна програма-сервер, типове завдання якої – очікування запиту на під'єднання від клієнтів і виконання певних дій у відповідь на запити. Для клієнт-серверної технології неважливо, де розташовані клієнт і сервер - на одній чи різних машинах. Звичайно, для успішного з'єднання клієнта із сервером клієнтові необхідно мати мінімальний набір даних про розташування сервера - для мереж ТСР/ІР це ІР-адреса комп'ютера і номер порту, на якому сервер очікує запити від клієнтів.
Кожен з комп'ютерів у мережі має свою унікальну ІР-адресу, яка використовується для обміну даними з іншими комп'ютерами.
Адреси діапазону від 127.0.0.1 до 127.255.255.255 задають локальний вузол: через них можуть зв'язуватися програми, що працюють на одному комп'ютері.
Для ініціалізації бібліотеки сокетів використовується функція WSAStartup. її слід викликати до першого виклику будь-якої іншої функції з бібліотеки сокетів.
int WSAStartup(
DWORD dwVersion,
WSAData wsa,
);
Параметр dwVersion задає версію бібліотеки сокетів. Вихідний параметр WSData повертає розширену інформацію про завантажену бібліотеку сокетів. У більшості випадків ця інформація не використовується, тому її можна ігнорувати.
Функція WSACleanup завершує роботу з бібліотекою сокетів.
Після того, як необхідна версія бібліотеки ініціалізована, необхідно створити сам сокет. Це роблять за допомогою функції socket:
SOCKET socket(
int af,
int SocketType,
int protocol
);
Параметр af визначає сімейство адрес для передачі даних через сокети.
Найчастіше використовується значення параметру AF_NET, яке відповідає
сімейству адрес протоколуIP4
Параметр SocketType задає тип сокета. Щоб використовувати для передачі даних
протокол TCP, який забезпечує надійний двонаправлений зв'язок, слід передати
значення SOCK_STREAM (сокет використовується для потокових протоколів).
Сам протокол, який використовуватиметься сокетом, задає параметр
protocol. Цей параметр можна також залишити рівним нулю - тоді буде обрано протокол за замовчуванням, який відповідає заданим першим двом параметрам.
Після того як сокет створено, його потрібно прив'язати до конкретної IP-адреси. Це роблять за допомогою функції bind:
int bind(
SOCKET S,
SockAddr addr,
int namelen
);
Параметром S задають дескриптор сокета (його повертає функція socket при створенні сокета).
Другий параметр (addr) представляє структуру даних (запис типу SockAddr), яка повинна містити IP-адресу, порт та протокол прив'язування для сокета. Поле sin_family цього запису задає сімейство протоколів.
Після успішного виклику функція повертає нульове значення, а помилковий виклик поверне SOCKET_ERROR.
Після створення серверний сокет слід перевести у режим "прослуховування", коли він очікує запити на з'єднання від клієнтів. Це здійснюють за допомогою функції listen:
int listen(
SOCKET S,
int backlog
);
Для сокета, який знаходиться у режимі прослуховування, система створює чергу під'єднань, розмір якої залежить від значення параметра backlog. Якщо його значення встановити у SOMAXCONN, черга матиме максимально можливий розмір.
Для з'єднання клієнтського сокета із серверним служить функція connect:
int connect(
SOCKET S,
SockAddr name,
int namelen
);
Адресу серверного сокета вказують у параметрі name так само, як при виклику функції bind. Параметр namelen повинен містити розмір структури name: (sizeof(namelen)).
Якщо клієнт викличе функцію connect і за вказаною адресою існує сокет у режимі прослуховування, то інформація про клієнта розміщується у черзі під'єднань клієнтського сокета - про це свідчить успішний виклик connect. Для встановлення з'єднання у відповідь на такий запит сервер повинен викликати функцію accept:
SOCKET accept(
SOCKET S,
SockAddr * addr,
int * addrlen
);
Параметр S - це дескриптор сокета, який знаходиться у режимі очікування з'еднань (і з черги під'єднань якого читаєгься інформація). Вказівник addr повинен вказувати на структуру, в якій будуть розміщені дані про клієнта, що встановив з'єднання. Параметр addrlen є вказівником на число, яке містить розмір структури addr.
При успішному виклику функції accept вона повертає дескриптор нового сокета, через який буде проводитися взаємодія. Такий сокет вже зв'язаний з IP-адресою та з'єднаний з клієнтським сокетом, тому ніяких додаткових операцій над собою не потребує. Початковий серверний сокет далі перебуває у режимі прослуховування, і повторним викликом функції accept можна встановити з'єднання з іншим клієнтом у відповідь на його запит.
Після того, як зв'язок між сервером і клієнтом встановлено, можна здійснювати передачу даних. За допомогою функції send через сокет можна надіслати дані:
int send(
SOCKET S,
const char* Buf;
int len,
int flags
);
Крім дескриптора сокета S, функція отримує вказівник Buf на буфер з даними, які потрібно відправити, та розмір даних (len). Параметр flags дозволяє задати додаткові опції обміну даними (для роботи у стандартному режимі йому слід присвоїти нульове значення).
Щоб отримати дані через з'єднані сокети, використовують функцію recv:
int recv(
SOCKET S,
const char* Buf;
int len,
int flags
);
Призначення її параметрів аналогічне, за винятком призначення буфера - у нього записуються прийняті дані.
Постановка задачі:
Програма складається з двох проектів: перший – це сервер, другий реалізує клієнт. Сервер має творити з’єднання та прив’язати його до конкретної ІР-адреси. В нашому випадку і клієнт і сервер функціонуватимуть на одному комп’ютері, тому використано спеціально відведену для таких випадків адресу 127.0.0.1. Для запуску на різних комп’ютерах потрібно прописати в програмі сервера ІР-адресу комп’ютера.
Клієнт підключається до сервера та здійснюється відправка та одержання повідомлень.
Дата добавления: 2015-10-02; просмотров: 54 | Нарушение авторских прав
<== предыдущая страница | | | следующая страница ==> |
Варіанти для індивідуальної роботи. | | | Хід виконання роботи. |