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

на главную

Жанры

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

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

Шрифт:

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

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, и тогда при

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

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

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

// пределы диапазона. Поэтому мы вручную добавляем ещё один

// #0 к строке, чтобы он стал законной ее частью.

Connection.Msg :=

AnsiUpperCase(StringReplace(Connection.Msg, #0, '#0', [rfReplaceAll])) +

'(AsyncSelect server)'#0;

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

Connection.Phase := tpSendString;

// Отправлено на этом этапе 0 байт

Connection.Offset := 0;

// Осталось отправить Length(Connection.Msg) байтов.

// Единицу к длине строки, в отличие от предыдущих

// примеров, не добавляем, т.к. там эта единица нужна была

// для того, чтобы учесть добавляемый к строке

// автоматически символ #0. Здесь мы еще один #0 добавили

// к строке явно, поэтому он уже учтен в функции Length.

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

Наследник павшего дома. Том IV

Вайс Александр
4. Расколотый мир
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наследник павшего дома. Том IV

Совершенный: пробуждение

Vector
1. Совершенный
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Совершенный: пробуждение

Сломанная кукла

Рам Янка
5. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Сломанная кукла

Провинциал. Книга 4

Лопарев Игорь Викторович
4. Провинциал
Фантастика:
космическая фантастика
рпг
аниме
5.00
рейтинг книги
Провинциал. Книга 4

Кодекс Охотника. Книга XXIV

Винокуров Юрий
24. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XXIV

Ох уж этот Мин Джин Хо – 3

Кронос Александр
3. Мин Джин Хо
Фантастика:
попаданцы
5.00
рейтинг книги
Ох уж этот Мин Джин Хо – 3

Измена. Не прощу

Леманн Анастасия
1. Измены
Любовные романы:
современные любовные романы
4.00
рейтинг книги
Измена. Не прощу

Рота Его Величества

Дроздов Анатолий Федорович
Новые герои
Фантастика:
боевая фантастика
8.55
рейтинг книги
Рота Его Величества

Изгой. Трилогия

Михайлов Дем Алексеевич
Изгой
Фантастика:
фэнтези
8.45
рейтинг книги
Изгой. Трилогия

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

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

Сделай это со мной снова

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

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

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

Ветер перемен

Ланцов Михаил Алексеевич
5. Сын Петра
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Ветер перемен

На границе империй. Том 9. Часть 4

INDIGO
17. Фортуна дама переменчивая
Фантастика:
космическая фантастика
попаданцы
5.00
рейтинг книги
На границе империй. Том 9. Часть 4