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

на главную - закладки

Жанры

О чём не пишут в книгах по 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.

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

Сама себе хозяйка

Красовская Марианна
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Сама себе хозяйка

Сердце Дракона. Том 11

Клеванский Кирилл Сергеевич
11. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
6.50
рейтинг книги
Сердце Дракона. Том 11

Первый среди равных. Книга IV

Бор Жорж
4. Первый среди Равных
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Первый среди равных. Книга IV

Неучтенный. Дилогия

Муравьёв Константин Николаевич
Неучтенный
Фантастика:
боевая фантастика
попаданцы
7.98
рейтинг книги
Неучтенный. Дилогия

Мастер Разума IV

Кронос Александр
4. Мастер Разума
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Мастер Разума IV

Авиатор: назад в СССР

Дорин Михаил
1. Авиатор
Фантастика:
попаданцы
альтернативная история
5.25
рейтинг книги
Авиатор: назад в СССР

Кадры решают все

Злотников Роман Валерьевич
2. Элита элит
Фантастика:
боевая фантастика
попаданцы
альтернативная история
8.09
рейтинг книги
Кадры решают все

Плеяда

Суконкин Алексей
Проза:
военная проза
русская классическая проза
5.00
рейтинг книги
Плеяда

Потусторонний. Книга 2

Погуляй Юрий Александрович
2. Господин Артемьев
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Потусторонний. Книга 2

Ученик. Книга 4

Первухин Андрей Евгеньевич
4. Ученик
Фантастика:
фэнтези
5.67
рейтинг книги
Ученик. Книга 4

Законник Российской Империи. Том 3

Ткачев Андрей Юрьевич
3. Словом и делом
Фантастика:
городское фэнтези
альтернативная история
аниме
дорама
5.00
рейтинг книги
Законник Российской Империи. Том 3

Ваше Сиятельство 7

Моури Эрли
7. Ваше Сиятельство
Фантастика:
боевая фантастика
аниме
5.00
рейтинг книги
Ваше Сиятельство 7

Война

Валериев Игорь
7. Ермак
Фантастика:
боевая фантастика
альтернативная история
5.25
рейтинг книги
Война

Младший сын князя. Том 4

Ткачев Андрей Юрьевич
4. Аналитик
Фантастика:
фэнтези
аниме
5.00
рейтинг книги
Младший сын князя. Том 4