А. Григорьев - О чём не пишут в книгах по Delphi

Здесь есть возможность читать онлайн «А. Григорьев - О чём не пишут в книгах по Delphi» — ознакомительный отрывок электронной книги совершенно бесплатно, а после прочтения отрывка купить полную версию. В некоторых случаях можно слушать аудио, скачать через торрент в формате fb2 и присутствует краткое содержание. Город: СПб, Год выпуска: 2008, ISBN: 2008, Издательство: БХВ-Петербург, Жанр: Программирование, на русском языке. Описание произведения, (предисловие) а так же отзывы посетителей доступны на портале библиотеки ЛибКат.

О чём не пишут в книгах по Delphi: краткое содержание, описание и аннотация

Предлагаем к чтению аннотацию, описание, краткое содержание или предисловие (зависит от того, что написал сам автор книги «О чём не пишут в книгах по Delphi»). Если вы не нашли необходимую информацию о книге — напишите в комментариях, мы постараемся отыскать её.

Рассмотрены малоосвещённые вопросы программирования в Delphi. Описаны методы интеграции VCL и API. Показаны внутренние механизмы VCL и приведены примеры вмешательства в эти механизмы. Рассмотрено использование сокетов в Delphi: различные механизмы их работы, особенности для протоколов TCP и UDP и др. Большое внимание уделено разбору ситуаций возникновения ошибок и получения неверных результатов в "простом и правильном" коде. Отдельно рассмотрены особенности работы с целыми, вещественными и строковыми типами данных, а также приведены примеры неверных результатов, связанных с ошибками компилятора, VCL и др. Для каждой из таких ситуаций предложены методы решения проблемы. Подробно рассмотрен синтаксический анализ в Delphi на примере арифметических выражений. Многочисленные примеры составлены с учётом различных версий: от Delphi 3 до Delphi 2007. Прилагаемый компакт-диск содержит примеры из книги.
Для программистов

О чём не пишут в книгах по Delphi — читать онлайн ознакомительный отрывок

Ниже представлен текст книги, разбитый по страницам. Система сохранения места последней прочитанной страницы, позволяет с удобством читать онлайн бесплатно книгу «О чём не пишут в книгах по Delphi», без необходимости каждый раз заново искать на чём Вы остановились. Поставьте закладку, и сможете в любой момент перейти на страницу, на которой закончили чтение.

Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

Как обычно, работа сервера начинается с инициализации слушающего сокета, выполняющейся при нажатии кнопки Запустить(листинг 2.50).

Листинг 2.50. Инициализация сервера, основанного на сообщениях

procedure TServerForm.BtnStartServerClick(Sender: TObject);

var

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

ServerAddr: TSockAddr;

begin

// Формируем адрес для привязки.

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

ServerAddr.sin_family := AF_INET;

ServerAddr.sin_addr.S_addr := INADDR_ANY;

try

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

if ServerAddr.sin_port = 0 then

begin

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

mtError, [mbOK], 0);

Exit;

end;

// Создание сокета

FServerSocket := socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);

if FServerSocket = INVALID_SOCKET then

begin

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

GetErrorString, mtError, [mbOK], 0);

Exit;

end;

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

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

begin

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

GetErrorString, mtError, [mbOK], 0);

closesocket(FServerSocket);

Exit;

end;

// Перевод сокета в режим прослушивания

if listen(FServerSocket, SOMAXCONN) = SOCKET_ERROR then

begin

MessageDlg('Ошибка при переводе сокета в режим прослушивания:'#13#10 +

GetErrorString, mtError, [mbOK], 0);

closesocket(FServerSocket);

Exit;

end;

// Связь слушающего сокета с событием FD_ACCEPT

if WSAAsyncSelect(FServerSocket, Handle,

WM_ACCEPTMESSAGE, FD_ACCEPT) = SOCKET_ERROR then

begin

MessageDlg('Ошибка при установке асинхронного режима ' +

'cлушающего сокета:'#13#10 + GetErrorString, mtError, [mbOK], 0);

closesocket(FServerSocket);

Exit;

end;

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

LabelPortNumber.Enabled := False;

EditPortNumber.Enabled := False;

BtnStartServer.Enabled := False;

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

except

on EConvertError do

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

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

MessageDlg('"' + EditPortNumber.Text +

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

on ERangeError do

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

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

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

mtError, [mbOK], 0);

end;

end;

Этот код мало чем отличается от того, что мы уже видели (сравните, например, с листингами 2.19 и 2.30). Единственное существенное отличие здесь — вызов функции WSAAsyncSelectпосле перевода сокета в режим прослушивания. Этот вызов связывает событие FD_ACCEPTс сообщением WM_ACCEPTMESSAGE.

Сообщение WM_ACCEPTMESSAGEнестандартное, мы должны сами определить его. Использовать это сообщение сервер будет только для определения момента подключения нового клиента, определять момент прихода данных мы будем с помощью другого сообщения — WM_SOCKETMESSAGE, которое тоже нужно определить. И, чтобы легче было писать обработчики для этих сообщений, объявим тип TWMSocketMessage, "совместимый" с типом TMessage(листинг 2.51).

Листинг 2.51. Сообщения, связанные с сокетами, и тип TWMSocketMessage

const

WM_ACCEPTMESSAGE = WM_USER + 1;

WM_SOCKETMESSAGE = WM_USER + 2;

type

TWMSocketMessage = packed record

Msg: Cardinal;

Socket: TSocket;

SockEvent: Word;

SockError: Word;

end;

Прежде чем реализовывать реакцию на эти сообщения, нужно позаботиться об обработке ошибок. Функция GetErrorString(см. листинг 2.6), столько времени служившая нам верой и правдой, нуждается в некоторых изменениях. Это связано с тем, что теперь код ошибки может быть получен не только в результате вызова функции WSAGetLastError, но и через параметр SockErrorсообщения. Новый вариант функции GetErrorStringиллюстрирует листинг 2.52.

Листинг 2.52. Новый вариант функции GetErrorString

// функция GetErrorString возвращает сообщение об ошибке,

// сформированное системой на основе значения, которое

// передано в качестве параметра. Если это значение

// равно нулю (по умолчанию), функция сама определяет

// код ошибки, используя функцию WSAGetLastError.

// Для получения сообщения используется системная функция

// FormatMessage.

function GetErrorString(Error: Integer = 0): string;

var

Читать дальше
Тёмная тема
Сбросить

Интервал:

Закладка:

Сделать

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

Представляем Вашему вниманию похожие книги на «О чём не пишут в книгах по Delphi» списком для выбора. Мы отобрали схожую по названию и смыслу литературу в надежде предоставить читателям больше вариантов отыскать новые, интересные, ещё непрочитанные произведения.


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

Обсуждение, отзывы о книге «О чём не пишут в книгах по Delphi» и просто собственные мнения читателей. Оставьте ваши комментарии, напишите, что Вы думаете о произведении, его смысле или главных героях. Укажите что конкретно понравилось, а что нет, и почему Вы так считаете.

x