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

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

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

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

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

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

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

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

Интервал:

Закладка:

Сделать

Connection := GetConnectionBySocket(Msg.Socket);

if Connection = nil then

begin

AddMessageToLog(

'Внутренняя ошибка сервера — не найдено соединение для сокета');

Exit;

end;

// Проверяем, были ли ошибки при взаимодействии

if Msg.SockError <> 0 then

begin

AddMessageToLog('Ошибка при взаимодействии с клиентом ' +

Connection.ClientAddr + ': ' + GetErrorString(Msg.SockError));

RemoveConnection;

Exit;

end;

// Анализируем, какое событие произошло

case Msg.SockEvent of

FD_READ: begin

// Проверяем, на каком этапе находится взаимодействие с клиентом.

if Connection.Phase = tpReceiveLength then

begin

// Этап получения от клиента длины строки. При выполнении этого

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

// в поле Connection.MsgSize. Здесь приходится учитывать, что

// теоретически даже такая маленькая (4 байта) посылка может

// быть разбита на несколько пакетов, поэтому за один раз этот

// этап не будет завершен, и второй раз его придется

// продолжать, загружая оставшиеся байты. Connection.Offset -

// количество уже прочитанных на данном этапе байтов -

// одновременно является смещением, начиная с которого

// заполняется буфер.

Res := recv(Connection.ClientSocket,

(PChar((PConnection.MsgSize + Connection.Offset)^, Connection.BytesLeft, 0);

if Res > 0 then

begin

// Если Res > 0, это означает, что получено Res байтов.

// Соответственно, увеличиваем на Res количество прочитанных

// на данном этапе байтов и на такую же величину уменьшаем

// количество оставшихся.

Inc(Connection.Offset, Res);

Dec(Connection.BytesLeft, Res);

// Если количество оставшихся байтов равно нулю, нужно

// переходить к следующему этапу.

if Connection.BytesLeft = 0 then

begin

// Проверяем корректность принятой длины строки

if Connection.MsgSize <= 0 then

begin

AddMessageToLog('Неверная длина строки, от клиента ' +

Connection.ClientAddr + ': ' + IntToStr(Connection.MsgSize));

RemoveConnection;

Exit;

end;

// Следующий этап - это чтение самой строки

Connection.Phase := tpReceiveString;

// Пока на этом этапе не прочитано ни одного байта

Connection.Offset := 0;

// Осталось прочитать Connection.MsgSize байтов

Connection.BytesLeft := Connection.MsgSize;

// Сразу выделяем память под строку

SetLength(Connection.Msg, Connection.MsgSize);

end;

end

elsе if Res = 0 then

begin

AddMessageToLog('Клиент ' + Connection.ClientAddr +

' закрыл соединение');

RemoveConnection;

Exit;

end

else

// Ошибку WSAEWOULDBLOCK игнорируем, т.к. она говорит

// только о том, что входной буфер сокета пуст, но в целом

// все в порядке - такое вполне возможно при ложных

// срабатываниях сообщения

if WSAGetLastError <> WSAEWOULDBLOCK then

begin

AddMessageToLog('Ошибка при получении данных от клиента ' +

Connection.ClientAddr + ': ' + GetErrorString);

RemoveConnection;

Exit;

end;

end

else if Connection.Phase = tpReceiveString then

begin

// Следующий этап - чтение строки. Он практически не отличается

// по реализации от этапа чтения длины строки, за исключением

// того, что теперь буфером, куда помещаются полученные от

// клиента данные, служит не Connection.MsgSize,

// a Connection.Msg.

Res :=

recv(Connection.ClientSocket, Connection.Msg(Connection.Offset + 1),

Connection.BytesLeft, 0);

if Res > 0 then

begin

Inc(Connection.Offset, Res);

Dec(Connection.BytesLeft, Res);

// Если количество оставшихся байтов равно нулю, можно

// переходить к следующему этапу.

if Connection.BytesLeft = 0 then

begin

AddMessageToLog('От клиента ' + Connection.ClientAddr +

' получена строка: ' + Connection.Msg);

// Преобразуем строку. В отличие от предыдущих примеров,

// здесь мы явно добавляем к строке #0. Это связано с тем,

// что при отправке, которая тоже может быть выполнена не

// за один раз, мы указываем индекс того символа строки,

// начиная с которого нужно отправлять данные. И (хотя

// теоретически вероятность этого очень мала) может

// возникнуть ситуация, когда за один раз будут отправлены

// все символы строки, кроме завершающего #0, и тогда при

// следующей отправке начинать придется с него. Если мы

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

Интервал:

Закладка:

Сделать

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

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


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

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

x