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 Мета та завдання дисципліни
Метою викладення дисципліни «Телекомунікаційні системи і технології» є з’ясування проблем розробки телекомунікаційних систем з використання сучасних інформаційних технологій та організації взаємодії телекомунікаційних систем з інформаційними системами.
Після вивчення дисципліни студенти повинні знати:
1 про типові телекомунікаційні пристрої;
2 про існуючі засоби побудови телекомунікаційних систем;
3 про сучасні мережеві пристрої;
4 про тенденції розвитку програмних засобів систем, що проектуються;
5 про методи дослідження спроектованих телекомунікаційних систем.
У результаті опанування навчальною дисципліною студенти повинні вміти:
1 розробляти структурні схеми телекомунікаційних систем;
2 програмувати телекомунікаційні пристрої;
3 досліджувати функціонування телекомунікаційних пристроїв;
4 знати архітектурні характеристики сучасних мережевих адаптерів та вміти їх застосовувати при проектуванні телекомунікаційних систем;
5 знати основи телекомунікаційних технологій.
Значення дисципліни для реалізації вимог кваліфікаційної характеристики фахівця та вивчення наступних дисциплін полягає в тому, що дисципліна охоплює широке коло питань, пов’язаних з розробкою, програмуванням та дослідженням телекомунікаційних систем і технологій.
Дисципліна є базовою для дисциплін «Метрологія та вимірювальна техніка», «Технології проектування комп’ютерних систем», «Проектування спеціалізованих КС», «Проектування вбудованих КС».
7.2 Зміст дисципліни
Дата: 2016-10-02, просмотров: 249.