Студопедия
Случайная страница | ТОМ-1 | ТОМ-2 | ТОМ-3
АрхитектураБиологияГеографияДругоеИностранные языки
ИнформатикаИсторияКультураЛитератураМатематика
МедицинаМеханикаОбразованиеОхрана трудаПедагогика
ПолитикаПравоПрограммированиеПсихологияРелигия
СоциологияСпортСтроительствоФизикаФилософия
ФинансыХимияЭкологияЭкономикаЭлектроника

Теоретичні відомості. Лабораторна робота № 6.

Читайте также:
  1. I. Теоретичні відомості
  2. І. Теоретичні відомості
  3. І. Теоретичні відомості
  4. І. Теоретичні відомості
  5. І. Теоретичні відомості
  6. І. Теоретичні відомості
  7. І. Теоретичні відомості

Лабораторна робота № 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 | Нарушение авторских прав


<== предыдущая страница | следующая страница ==>
Варіанти для індивідуальної роботи.| Хід виконання роботи.

mybiblioteka.su - 2015-2024 год. (0.012 сек.)