Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ППуКМ / Labs 1-7 / Лабораторна робота №2.doc
Скачиваний:
15
Добавлен:
18.03.2016
Размер:
115.2 Кб
Скачать

Лабораторна робота № 3 тема:

Сокети windows. Протоколи із встановленням зєднання

  1. Серверні api-функції

    1. Створення сокетів

Сервер - це процес, що очікує підключення клієнтів для обслуговування їхніх запитів. Сервер повинен прослуховувати з'єднання на заданому імені. Ім’я – це структура типу sockaddr. У кожного протоколу своя схема адресації, а тому й свої особливості іменування. У ТСР/IР таким ім'ям є IP-адреса та номер порту. Перший крок встановлення з'єднання – за допомогою функції bind прив'язка сокета до стандартного імені, заданого у форматі даного протоколу. Другий – переведення сокета в режим прослуховування функцією listen. І нарешті, сервер повинен прийняти з'єднання клієнта функцією accept.

Функція bind

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

int bind(

SOCKET s,

const sockaddr* name,

int namelen

);

Параметри:

s - задає сокет, на якому сервер очікує з'єднання клієнтів.

name - універсальний буфер, у нього потрібно помістити адресу, що відповідає стандартам використовуваного протоколу, а потім при виклику bind привести його до типу sockaddr.

namelen – довжина змінної name, у байтах.

Функція listen

Переводить сокет у стан очікування запитів на з'єднання.

int listen(

SOCKET s,

int backlog

);

Параметри:

s - зв'язаний сокет.

backlog - визначає максимальну довжину черги з'єднань, що очікують обробки.

Якщо помилки не відбулося функція listen повертає значення 0. Інакше вона повертає значення SOCKET_ERROR.

Функція accept

Приймає з'єднання від клієнта.

SOCKET accept(

SOCKET s,

struct sockaddr* addr,

int* addrlen

);

Параметри:

s - зв'язаний сокет у стані прослуховування.

addr - адреса дійсної структури SOCKADDR_IN.

addrlen - посилання на довжину структури SOCKADDR_IN.

Функція accept повертає новий дескриптор сокета, що відповідає прийнятому клієнтському з'єднанню Для всіх наступних операцій із цим клієнтом повинен застосовуватися новий сокет. Вихідний що прослуховує сокет використається для прийому інших клієнтських з'єднань і продовжує перебувати в режимі прослуховування.

API-функції клієнта

Клієнтська частина значно простіша і для встановлення з'єднання потрібно лише три кроки: створити сокет функцією socket, дозволити ім'я сервера (залежить від використовуваного протоколу), ініціювати з'єднання функцією connect.

Функція connect

Встановлює з'єднання із сервером.

int connect(

SOCKET s,

const struct sockaddr* name,

int namelen

);

Параметри:

s - існуючий ТСР-сокет для встановлення з'єднання.

nаmе - структура адреси сокета (SOCKADDR_IN), що описує сервер, до якого підключаються.

namelen — довжина змінної nаmе.

    1. Передавання даних

По суті, у мережному програмуванні саме головне - уміти відправляти й приймати дані. Для пересилання даних по сокету використаються функція send. Аналогічно, для прийому даних існує функція recv.

Всі буфери, що використовуються при відправленні й прийомі даних, складаються з елементів типу char. Тобто, ці функції не призначені для роботи з кодуванням UNICODE. Це особливо важливо для Windows CE, тому що вона використає UNICODE за замовчуванням. Відправити рядок символів UNICODE можна двома способами: у вихідному вигляді або привести до типу char. Річ у тім, що при заданні кількості символів, що відправляються або прийнятих, результат функції, що визначає довжину рядка, потрібно помножити на 2, тому що кожний UNICODE-символ займає 2 байти строкового масиву. Інший спосіб: спочатку перевести рядок з UNICODE в ASCII функцією WideCharToMuMByte.

Функція send

Передає дані по сокету.

int send(

SOCKET s,

const char* buf,

int len,

int flags

);

Параметри:

s - визначає сокет для відправлення даних.

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

len - задає число символів, що відправляють із буфера.

flags – вказує тип шляху доставки даних.

Параметр flags може приймати значення 0, MSG_DONTROUTE, MSG_OOB, або результат логічного АБО над будь-якими із цих параметрів. При вказані значення MSG_DONTROUTE транспорт не буде маршрутизувати відправляючі пакети. Обробка цього запиту залишається на розсуд базового протоколу (наприклад, якщо транспорт не підтримує цей параметр, запит ігнорується). MSG_OOBвказує, що дані повинні бути відправлені поза смугою (out of band), тобто терміново.

При успішному виконанні функція send поверне кількість переданих байт, інакше - помилку SOCKET_ERROR.

Функція recv

Приймає дані по сокету.

int recv(

SOCKET s,

char* buf,

int len,

int flags

);

Параметри:

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

buf - символьний буфер призначений для отриманих даних.

len - указує число прийнятих байт або розмір буфера buf.

flags – вказує тип шляху доставки даных.

При успішному виконанні функція recv повертає кількість прийнятих байт, інакше - помилку SOCKET_ERROR.

Функція closesocket

Закриває сокет.

int closesocket(

SOCKET s

);

Параметри:

s - описователь сокета.

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