Мета роботи: вивчення роботи асинхронних сокетами в режимі потоків виконання, тобто в режимі, коли робота з кожним клієнтом проводиться в окремому серверному потоці.

6.1 Теоретичні відомості

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

У випадку з синхронними сокетами сервер прийнявши нового клієнта працює з ним (обмінюється інформацією), але інші клієнти чекають в черзі, поки сервер не завершить роботу з цим. Асинхронні сокети працюють паралельно - витягує клієнта з черги, породжує потік/процес, передає йому дескриптор клієнта (котрий повернула функція accept), цей потік/процес починає працювати в фоні, в свою чергу сервер знову витягує нового клієнта з черги і так далі.

Асинхронні сокети слід використовувати там, де є велике навантаження при передачі даних.

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

6.1.1 Текст програми

Реалізація сервера:

#include "stdafx.h"

#include <winsock2.h>

#include <conio.h>

#include <process.h>

#pragma comment(lib, "wsock32.lib")

 

#define SERVER_SOCKET_ERROR 1

#define SOCKET_OK 0

 

char buffer[]="ANY DATA";

char recv_buf[1000];

 

void MyFunction( void* Arg )

{

SOCKET Client=(*(int *)Arg);

recv(Client,recv_buf,1000,0);

printf(" = Message from client: %s\n",&recv_buf[0]);

send(Client,recv_buf,1000,0);

_endthreadex(0);

}

 

int _tmain(int argc, _TCHAR* argv[])

{

int result;

WORD sockVersion;

WSADATA wsaData;

sockVersion = MAKEWORD(2,2);

WSAStartup(sockVersion, &wsaData);

 

sockaddr_in sin;

sin.sin_family = AF_INET;

sin.sin_port = htons(8888);

sin.sin_addr.s_addr = INADDR_ANY;

int size_sin=sizeof(sin);

 

SOCKET Client;

SOCKET s = socket(AF_INET, SOCK_STREAM, 0);

if(s == INVALID_SOCKET)

{

printf ("%s", "ERROR (don't create serrver)\n");

WSACleanup();

return SERVER_SOCKET_ERROR;

}

else

{

printf ("%s", " >>> Create socket \n");

}

 

result = bind(s, (LPSOCKADDR)&sin, sizeof(sin));

if(result == SOCKET_ERROR)

{

printf ("%s", "ERROR (don't associates a local address

with a socket)");

WSACleanup();

return SERVER_SOCKET_ERROR;

}

else

{

printf ("%s", " >>> Associates a local addres with

a socket\n");

}

 

result = listen(s, 5);

if(result == SOCKET_ERROR)

{

printf ("%s", " ERROR (don't listen a socket )\n");

WSACleanup();

return SERVER_SOCKET_ERROR;

}

else

{

printf ("%s", " >>> get socket to listen \n");

}

 

while (1)

{

Client=accept(s,(struct sockaddr*)&sin,&size_sin);

_beginthread(MyFunction,0,(void *)&Client);

 

}

closesocket(s);

printf ("%s", " >>> Close main socket \n");

WSACleanup();

getch();

 

return SOCKET_OK;

}

 

 

Реалізація клієнта:

#include "stdafx.h"

#include<conio.h>

#include <winsock.h>

#include<process.h>

#pragma comment(lib, "wsock32.lib")

 

#define CS_ERROR 1

#define CS_OK 0

 

char send_buf[1000] = "";

char recv_buf[1000] = "";

 

void MyFunction(void * Arg)

{

while(1)

{

int Socket=(*(int *)Arg);

send(Socket,send_buf,1000,0);

int n = recv(Socket,recv_buf,1000,0);

recv_buf[n]=0;

printf(" Answer from Server: %s",&recv_buf[0]);

printf("\n");

}

_endthread();

}

 

int _tmain(int argc, _TCHAR* argv[])

{

WORD version;

WSADATA wsaData;

int result;

version = MAKEWORD(2,2);

WSAStartup(version,(LPWSADATA)&wsaData);

 

LPHOSTENT hostEntry;

hostEntry = gethostbyname("127.0.0.1");

if(!hostEntry)

{

printf ("%s", " >>> ERROR (hostEntry NULL)\n");

WSACleanup();

return CS_ERROR;

}

 

SOCKET theSocket = socket(AF_INET, SOCK_STREAM, 0);

if(theSocket == SOCKET_ERROR)

{

printf ("%s", " ERROR (don't create socket)\n");

return CS_ERROR;

}

else

{

printf ("%s", " >>> Create socket \n");

}

 

sockaddr_in serverInfo;

serverInfo.sin_family = AF_INET;

serverInfo.sin_addr = *((LPIN_ADDR)*hostEntry->h_addr_list);

serverInfo.sin_port = htons(8888);

 

result=connect(theSocket,(LPSOCKADDR)&serverInfo,

sizeof(serverInfo));

if(result==SOCKET_ERROR)

{

printf ("%s", " ERROR (don't connect to Server)\n");

return CS_ERROR;

}

else

{

printf ("%s", " >>> Connect to Server\n");

}

 

printf("\nWrite message: ");

scanf ("%s", send_buf);

_beginthread(MyFunction,0,(void *)&theSocket);

char a[100];

scanf ("%s", a);

return CS_OK;

}

6.2 Завдання

Написати клієнт-серверний застосунок, котрий буде працювати з потоковими або датаграмними сокетами в асинхронному режимі.

Для студентів котрі хочуть отримати відмінну оцінку: клієнт повинен надіслати якийсь файл, наприклад рисунок. Задача сервера, зберегти його в папці, з назвою яка відповідає даті прийняття файлу;

6.3 Питання

1. Що таке сокет, які є типи та види сокетів?

2. В чому полягає різниця між Winsock та сокетами, котрі використовуються в UNIX подібних системах?

3. Які функції потрібно використовувати при роботі з потоками?

4. Коли бажано використовувати асинхронні сокети? Чому ви так вважаєте?

 

Самостійна робота

7.1 Мета та завдання дисципліни

Метою викладення дисципліни «Технології та системи комунікацій» є з’ясування проблем розробки телекомунікаційних систем з використання сучасних інформаційних технологій та організації взаємодії телекомунікаційних систем з інформаційними системами.

Після вивчення дисципліни студенти повинні знати:

– основні принципи побудови мереж SDH, рівні транспортної мережі;

– побудову циклів передачі синхронних транспортних модулів;

– структуру заголовків та показників циклів передачі, алгоритм побудови циклу передачі сигналу STM-N;

– склад базового мультиплексора та його структурну схему;

– особливості синхронних цифрових систем передачі;

– структуру і основні параметри синхронних лінійних трактів;

– прості, щільні та високощільні системи передачі WDM;

– топологію мереж SDH;

– архітектуру безпроводових локальних мереж;

– архітектуру і принципи функціонування мобільних мереж;

У результаті опанування навчальною дисципліною студенти повинні вміти:

– розробляти структурні схеми та програмувати телекомунікаційні системи;

– програмувати телекомунікаційні пристрої;

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

– знати основи телекомунікаційних технологій.

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

7.2 Зміст дисципліни