Самостоятельная работа
по теме�«Сетевое программирование в среде С++ Builder»
Подготовили студенты 12 группы:
Снятков В.С., Станкевич П.А.
Преподаватель-консультант:
Матысик И.А.
Государственное бюджетное профессиональная учебное заведение Санкт-Петербургский колледж информационных технологий
Санкт-Петербург, 2014
Введение в сетевое програмиирование
Теоретическая часть
Сокеты – это программный интерфейс обеспечивающий обмен данными в сети.
Клиентские
инициируют соединение, указывая DNS/IP удалённого сервера и порт, используемый сервером
Серверные обрабатывают запрос из очереди запросов и непосредственно устанавливают соединение с клиентским сокетом.
Способы сетевого программирования
Программирование с использованием библиотеки winsock.h
Программирование с использованием компонентов Indy
Программирование с использованием компонентов ClientSocket и ServerSocket
Программирование с использованием библиотеки 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-адреса:
Программирование с использованием компонентов Indy
Indy в C++ Builder XE4:
Indy в C++ Builder 6:
Программирование с использованием�компонентов ClientSocket и ServerSocket
ClientSocket
ServerSocket
Назначение компонента ClientSocket
Internet -> ClientSocket - расположение
Используется для клиентской части приложения для получение от сервера и передачи серверу сообщений
Свойства компонента ClientSocket
bool Active - определяет, является ли соединение активным.
String Host - имя удалённого сервера
String Address - IP-адрес удалённого сервера
Для указания сервера можно задать значение только одного из этих свойств. Если же заданы оба значения, то предпочтение отдаётся имени.
unsigned int Port - порт, используемый сервером
(может принимать значение от 0 до 65535)
Методы компонента ClientSocket
void Open() - устанавливает соединение с сервером. При удачном выполнении метода свойство Active переходит в true.
void Close() - разрывает соединение с сервером. При удачном выполнении метода свойство Active переходит в false.
События компонента ClientSocket
OnConnecting (TObject *Sender, TCustomWinSocket *Socket)
Событие наступает в тот момент, когда сокет сервера найден, но соединение ещё не установлено.
OnConnect(TObject *Sender, TCustomWinSocket *Socket)
Событие наступает после установления соединения с сервером.
OnDisconnect(TObject *Sender, TCustomWinSocket *Socket)
Событие наступает в момент разрыва соединения с сервером.
OnRead(TObject *Sender, TCustomWinSocket *Socket)
Событие наступает в момент получения клиентом сообщения от сервера.
Назначение компонента ServerSocket
Internet -> ServerSocket – расположение в Палитре
Используется для серверной части приложения для обработки запросов клиентов
Свойства компонента ServerSocket
bool Active - определяет, является ли сервер активным.
unsigned int Port - порт, используемый для создания сервера;
TCustomWinSocket* Socket->Connections
Индексированный массив активных подключений к серверу. Каждый элемент этого массива содержит в себе информацию о клиентском сокете.
int Socket->ActiveConnections
Переменная, хранящая в себе количество активных подключений к серверу.
Пример работы ServerSocket
Пример кода рассылки сервером сообщения «Hello, world» всем подключённым пользователям:
for (int i = 0; i < ServerSocket1->Socket->ActiveConnections; i++)
{
ServerSocket->Socket->Connections[i]->SendText(“Hello, world”);
}
Методы компонента ServerSocket
void Open() - создаёт сервер. При удачном выполнении метода свойство Active переходит в true.
void Close() - разрушает сервер. При удачном выполнении метода свойство Active переходит в false.
События компонента ServerSocket
OnClientRead(TObject *Sender, TCustomWinSocket *Socket)
Событие наступает в момент получения сервером от клиента какого-либо сообщения.
OnClientConnect(TObject *Sender, TCustomWinSocket *Socket)
Событие наступает в момент подключения клиента к серверу.
OnClientDisconnect(TObject *Sender, TCustomWinSocket *Socket)
Событие наступает в момент отключения клиента от сервера.
Передача/прием данных
Socket->SendText(“Text”); //Передает строку в любом событии
Socket->ReceiveText(); //Принимает строку в событии OnRead или OnClientRead
Пример передачи данных
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());
Последовательность действий
Событие клиента | Событие сервера |
Подключение клиента к серверу | |
Open() |
|
OnConnecting | OnClientWrite |
OnConnect | OnClientConnect |
Отключение клиента от сервера | |
Close() |
|
OnDisconnect | OnClientDisconnect |
Передача данных серверу | |
SendText() | OnClientRead |
Приём данных от сервера | |
OnRead | SendText() |