Чтение онлайн

на главную

Жанры

О чём не пишут в книгах по Delphi

Григорьев Антон Борисович

Шрифт:
Листинг 2.9. Обработчик нажатия кнопки Запустить

// Реакция на кнопку "Запустить"

procedure TChatForm.BtnStartServerClick(Sender: TObject);

var

 // Сокет для приема сообщений

 ServerSocket: TSocket;

 // Адрес, к которому привязывается сокет для приема сообщений

 ServerAddr: TSockAddr;

begin

 //
Формирование адреса сокета для приема сообщений

 FillChar(ServerAddr.sin_zero, SizeOf(ServerAddr.sin_zero), 0);

 ServerAddr.sin_family := AF_INET;

 // IP-адрес может выбрать система, а порт назначаем тот,

 // который задан пользователем

 ServerAddr.sin_addr.S_addr := INADDR_ANY;

 try

// He забываем преобразовать номер порта к сетевому формату

// с помощью функции htons

ServerAddr.sin_port := htons(StrToInt(EditServerPort.Text));

if ServerAddr.sin_port = 0 then

begin

MessageDlg('Номер порта должен находиться в диапазоне 1-65535',

mtError, [mbOK], 0);

Exit;

end;

// Создание сокета для получения сообщений

ServerSocket := socket(AF_INET, SOCK_DGRAM, IPPROTO_UDP);

if ServerSocket = INVALID_SOCKET then

begin

MessageDlg('Ошибка при создании сокета: '#13#10 + GetErrorString,

mtError, [mbOK], 0);

Exit;

end;

// привязка сокета к адресу

if bind(ServerSocket, ServerAddr, SizeOf(ServerAddr)) = SOCKET_ERROR then

begin

MessageDlg('Ошибка при привязке сокета к адресу: '#13#10 + GetErrorString,

mtError, [mbOK], 0);

closesocket(ServerSocket);

Exit;

end;

// Создание нити, которая будет получать сообщения.

// Сокет передается ей, и дальше она отвечает за него.

TReceiveThread.Create(ServerSocket);

// Перевод элементов управления в состояние "Сервер работает"

LabelServerPort.Enabled := False;

EditServerPort.Enabled := False;

BtnStartServer.Enabled := False;

LabelServerState.Caption:= 'Сервер работает';

 except

on EConvertError do

//
Это исключение может возникнуть только в одном месте -

// при вызове StrToInt(ЕditServerPort.Text)

MessageDlg('"' + EditServerPort.Text +

'" не является целым числом', mtError, [mbOK], 0);

on ERangeError do

// Это исключение может возникнуть только в одном месте -

// при присваивании значения номеру порта

MessageDlg('Номер порта должен находиться в диапазоне 1-65535",

mtError, [mbOK], 0);

 end;

end;

Для отправки сообщения пользователь должен нажать кнопку Отправить. При этом формируется адрес на основании введённых пользователем данных и вызывается функция

sendto
(листинг 2.10). Пользователь должен каким-то образом узнать, какой порт назначения выбран у адресата. Его IP-адрес тоже, разумеется, необходимо знать.

Листинг 2.10. Обработчик нажатия кнопки Отправить

// Реакция на кнопку "Отправить"

procedure TChatFormBtnSendClick(Sender: TObject);

var

 // Адрес назначения SendAddr: TSockAddr;

 // Сообщение для отправки

 Msg: string;

 // Результат отправки

 SendRes: Integer;

begin

 // Формируем адрес назначения на основе того,

 // что пользователь ввел в соответствующие поля

 FillChar(SendAddr.sin_zero, SizeOf(SendAddr.sin_zero), 0);

 SendAddr.sin_family := AF_INET;

 SendAddr.sin_addr.S_addr := inet_addr(PChar(EditSendAddr.Text));

 // Для совместимости со старыми версиями Delphi приводим

 // константу INADDR_NONE к типу u_long

 if SendAddr.sin_addr.S_addr = u_long(INADDR_NONE) then

 begin

MessageDlg('"' +EditSendAddr.Text + '"не является IP-адресом',

mtError, [mbOK], 0);

Exit;

 end;

 try

SendAddr.sin_port := htons(StrToInt(EditSendPort.Text));

// Получаем сообщение, которое ввел пользователь.

// Дополнительная переменная понадобилась потому,

// что нам потребуется ее передавать в качестве var-параметра,

Поделиться:
Популярные книги

Измена. Я отомщу тебе, предатель

Вин Аманда
1. Измены
Любовные романы:
современные любовные романы
5.75
рейтинг книги
Измена. Я отомщу тебе, предатель

Сводный гад

Рам Янка
2. Самбисты
Любовные романы:
современные любовные романы
эро литература
5.00
рейтинг книги
Сводный гад

Мимик нового Мира 6

Северный Лис
5. Мимик!
Фантастика:
юмористическая фантастика
попаданцы
рпг
5.00
рейтинг книги
Мимик нового Мира 6

Идеальный мир для Лекаря 2

Сапфир Олег
2. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 2

Начальник милиции

Дамиров Рафаэль
1. Начальник милиции
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Начальник милиции

Магия чистых душ

Шах Ольга
Любовные романы:
любовно-фантастические романы
5.40
рейтинг книги
Магия чистых душ

Темный Патриарх Светлого Рода 4

Лисицин Евгений
4. Темный Патриарх Светлого Рода
Фантастика:
фэнтези
юмористическое фэнтези
аниме
5.00
рейтинг книги
Темный Патриарх Светлого Рода 4

Стрелок

Астахов Евгений Евгеньевич
5. Сопряжение
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Стрелок

На границе империй. Том 6

INDIGO
6. Фортуна дама переменчивая
Фантастика:
боевая фантастика
космическая фантастика
попаданцы
5.31
рейтинг книги
На границе империй. Том 6

Архил…? Книга 3

Кожевников Павел
3. Архил...?
Фантастика:
фэнтези
попаданцы
альтернативная история
7.00
рейтинг книги
Архил…? Книга 3

Доктора вызывали? или Трудовые будни попаданки

Марей Соня
Фантастика:
юмористическая фантастика
попаданцы
5.00
рейтинг книги
Доктора вызывали? или Трудовые будни попаданки

Лорд Системы 11

Токсик Саша
11. Лорд Системы
Фантастика:
фэнтези
попаданцы
рпг
5.00
рейтинг книги
Лорд Системы 11

Черный Маг Императора 5

Герда Александр
5. Черный маг императора
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Черный Маг Императора 5

Последний попаданец 2

Зубов Константин
2. Последний попаданец
Фантастика:
юмористическая фантастика
попаданцы
рпг
7.50
рейтинг книги
Последний попаданец 2