О чём не пишут в книгах по 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-параметра,
Поделиться:
Популярные книги
Свадьба по приказу, или Моя непокорная княжна
Любовные романы:
любовно-фантастические романы
5.57
рейтинг книги
Сборник коротких эротических рассказов
Любовные романы:
эро литература
love action
7.25
рейтинг книги
Отец моего жениха
Любовные романы:
современные любовные романы
7.79
рейтинг книги
Вадбольский
1. Вадбольский
Фантастика:
попаданцы
5.00
рейтинг книги
Бастард Императора. Том 7
7. Бастард Императора
Фантастика:
городское фэнтези
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Повелитель механического легиона. Том VIII
8. Повелитель механического легиона
Фантастика:
технофэнтези
аниме
фэнтези
5.00
рейтинг книги
В зоне особого внимания
12. Девяностые
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Таня Гроттер и магический контрабас
1. Таня Гроттер
Фантастика:
фэнтези
8.52
рейтинг книги
Бастард Императора. Том 2
2. Бастард Императора
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга ХI
11. РОС: Кодекс Крови
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Третий
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
Возвышение Меркурия. Книга 16
16. Меркурий
Фантастика:
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 9
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Потусторонний. Книга 1
1. Господин Артемьев
Фантастика:
фэнтези
попаданцы
5.00