1 of 19

Самостоятельная работа

по теме�«Сетевое программирование в среде С++ Builder»

Подготовили студенты 12 группы:

Снятков В.С., Станкевич П.А.

Преподаватель-консультант:

Матысик И.А.

Государственное бюджетное профессиональная учебное заведение Санкт-Петербургский колледж информационных технологий

Санкт-Петербург, 2014

2 of 19

Введение в сетевое програмиирование

3 of 19

Теоретическая часть

Сокеты – это программный интерфейс обеспечивающий обмен данными в сети.

Клиентские

инициируют соединение, указывая DNS/IP удалённого сервера и порт, используемый сервером

Серверные обрабатывают запрос из очереди запросов и непосредственно устанавливают соединение с клиентским сокетом.

4 of 19

Способы сетевого программирования

Программирование с использованием библиотеки winsock.h

Программирование с использованием компонентов Indy

Программирование с использованием компонентов ClientSocket и ServerSocket

5 of 19

Программирование с использованием библиотеки winsock.h

WORD wVersionRequested;

WSADATA wsaData;

wVersionRequested = MAKEWORD(1, 0);

int err = WSAStartup(wVersionRequested, &wsaData);

if (err == 0)

{

char Buf[128];

gethostname(&Buf[0], 128);

hostent *h;

h = gethostbyname(&Buf[0]);

if (h != NULL)

{

char *LocalIp = new char[15];

sprintf(LocalIp, "%d.%d.%d.%d",

(unsigned char)h->h_addr_list[0][0],

(unsigned char)h->h_addr_list[0][1],

(unsigned char)h->h_addr_list[0][2],

(unsigned char)h->h_addr_list[0][3]);

edAddress->Text = LocalIp;

}

}

Фрагмент кода автоопрделения IP-адреса:

6 of 19

Программирование с использованием компонентов Indy

Indy в C++ Builder XE4:

Indy в C++ Builder 6:

7 of 19

Программирование с использованием�компонентов ClientSocket и ServerSocket

ClientSocket

ServerSocket

8 of 19

Назначение компонента ClientSocket

Internet -> ClientSocket - расположение

Используется для клиентской части приложения для получение от сервера и передачи серверу сообщений

9 of 19

Свойства компонента ClientSocket

bool Active - определяет, является ли соединение активным.

String Host - имя удалённого сервера

String Address - IP-адрес удалённого сервера

Для указания сервера можно задать значение только одного из этих свойств. Если же заданы оба значения, то предпочтение отдаётся имени.

unsigned int Port - порт, используемый сервером

(может принимать значение от 0 до 65535)

10 of 19

Методы компонента ClientSocket

void Open() - устанавливает соединение с сервером. При удачном выполнении метода свойство Active переходит в true.

void Close() - разрывает соединение с сервером. При удачном выполнении метода свойство Active переходит в false.

11 of 19

События компонента ClientSocket

OnConnecting (TObject *Sender, TCustomWinSocket *Socket)

Событие наступает в тот момент, когда сокет сервера найден, но соединение ещё не установлено.

OnConnect(TObject *Sender, TCustomWinSocket *Socket)

Событие наступает после установления соединения с сервером.

OnDisconnect(TObject *Sender, TCustomWinSocket *Socket)

Событие наступает в момент разрыва соединения с сервером.

OnRead(TObject *Sender, TCustomWinSocket *Socket)

Событие наступает в момент получения клиентом сообщения от сервера.

12 of 19

Назначение компонента ServerSocket

Internet -> ServerSocket – расположение в Палитре

Используется для серверной части приложения для обработки запросов клиентов

13 of 19

Свойства компонента ServerSocket

bool Active - определяет, является ли сервер активным.

unsigned int Port - порт, используемый для создания сервера;

TCustomWinSocket* Socket->Connections

Индексированный массив активных подключений к серверу. Каждый элемент этого массива содержит в себе информацию о клиентском сокете.

 

int Socket->ActiveConnections

Переменная, хранящая в себе количество активных подключений к серверу.

14 of 19

Пример работы ServerSocket

Пример кода рассылки сервером сообщения «Hello, world» всем подключённым пользователям:

for (int i = 0; i < ServerSocket1->Socket->ActiveConnections; i++)

{

ServerSocket->Socket->Connections[i]->SendText(“Hello, world”);

}

15 of 19

Методы компонента ServerSocket

void Open() - создаёт сервер. При удачном выполнении метода свойство Active переходит в true.

void Close() - разрушает сервер. При удачном выполнении метода свойство Active переходит в false.

16 of 19

События компонента ServerSocket

OnClientRead(TObject *Sender, TCustomWinSocket *Socket)

Событие наступает в момент получения сервером от клиента какого-либо сообщения.

OnClientConnect(TObject *Sender, TCustomWinSocket *Socket)

Событие наступает в момент подключения клиента к серверу.

OnClientDisconnect(TObject *Sender, TCustomWinSocket *Socket)

Событие наступает в момент отключения клиента от сервера.

17 of 19

Передача/прием данных

Socket->SendText(“Text”); //Передает строку в любом событии

Socket->ReceiveText(); //Принимает строку в событии OnRead или OnClientRead

18 of 19

Пример передачи данных

Client:

ClientSocket->Socket->SendText(Edit1->Text); //Послали на сервер

Server:

OnClientRead :

for (int i=0; i<ServerSocket1->Socket-> ActiveConnections; i++)

{

ServerSocket->Socket->Connections[i]-> SendText(Socket->ReceiveText());

}

Client:

OnRead:

Memo1->Lines->Add(Socket->ReceiveText());

19 of 19

Последовательность действий

Событие клиента

Событие сервера

Подключение клиента к серверу

Open()

 

OnConnecting

OnClientWrite

OnConnect

OnClientConnect

Отключение клиента от сервера

Close()

 

OnDisconnect

OnClientDisconnect

Передача данных серверу

SendText()

OnClientRead

Приём данных от сервера

OnRead

SendText()