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

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

Жанры

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

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

Шрифт:

 RecvBufSize = 4096;

var

 // Буфер для приема сообщений

 RecvBuf: array[0..RecvBufSize - 1] of Byte;

 RecvRes: Integer;

 NetEvents: TWSANetworkEvents;

 // Полученная строка

 Str: string;

 // Длина полученной строки

 StrLen: Integer;

 //
Если ReadLength = True, идет чтение длины строки,

 // если False - самой строки

 ReadLength: Boolean;

 // Смещение от начала приемника

 Offset: Integer;

 // Число байтов, оставшихся при получении длины строки или самой строки

 BytesLeft: Integer;

 Р: Integer;

 I: Integer;

 LoopExit: Boolean;

 WaitRes: Cardinal;

begin

 LogMessage('Соединение установлено');

 ReadLength := True;

 Offset := 0;

 BytesLeft := SizeOf(Integer);

 repeat

WaitRes := WSAWaitForMultipleEvents(3, @FEvents, False, WSA_INFINITE, False);

case WaitRes of

WSA_WAIT_EVENT_0: begin

// Закрываем соединение с клиентом и останавливаем нить

LogMessage('Получен сигнал об остановке нити');

shutdown(FSocket, SD_BOTH);

Break;

end;

WSA_WAIT_EVENT_0 + 1:

begin

// Сбрасываем событие и отправляем данные

WSAResetEvent(FEvents[1]);

if not DoSendBuf then Break;

end;

WSA_WAIT_EVENT_0 + 2: begin

// Произошло событие, связанное с сокетом.

// Проверяем, какое именно, и заодно сбрасываем его

if WSAEnumNetworkEvents(FSocket, FEvents[2], NetEvents) = SOCKET_ERROR then

begin

LogMessage('Ошибка при получении списка событий: ' + GetErrorString);

Break;

end;

if NetEvents.lNetworkEvents and FD_READ <> 0 then

begin

if NetEvents.iErrorCode[FD_READ_BIT] <> 0 then

begin

LogMessage('Ошибка в событии FD_READ: ' +

GetErrorString(NetEvents.iErrorCode[FD_READ_BIT]));

Break;

end;

//
В буфере сокета есть данные.

// Копируем данные из буфера сокета в свой буфер RecvBuf

RecvRes := recv(FSocket, RecvBuf, SizeOf(RecvBuf), 0);

if RecvRes > 0 then

begin

P := 0;

// Эта переменная нужна потому, что здесь появляется

// вложенный цикл, при возникновении ошибки в котором нужно

// выйти и из внешнего цикла тоже. Так как в Delphi нет

// конструкции типа Break(2) в Аде, приходится прибегать

// к таким способам: если нужен выход из внешнего цикла,

// во внутреннем цикле выполняется LoopExit := True,

// а после выполнения внутреннего цикла проверяется

// значение этой переменной и при необходимости выполняется

// выход и из главного цикла.

LoopExit := False;

// В этом цикле мы извлекаем данные из буфера

// и раскидываем их по приёмникам - Str и StrLen.

while Р < RecvRes do

begin

// Определяем, сколько байтов нам хотелось бы скопировать

L := BytesLeft;

// Если в буфере нет такого количества,

// довольствуемся тем, что есть

if Р + L > RecvRes then L := RecvRes - P;

// Копируем в соответствующий приемник

if ReadLength then

Move(RecvBuf[P], (PChar(@StrLen) + Offset)^, L)

else Move(RecvBuf[P], Str(Offset + 1), L);

Dec(BytesLeft, L);

// Если прочитали все, что хотели,

// переходим к следующему

if BytesLeft = 0 then

begin

ReadLength := not ReadLength;

Offset := 0;

// Если закончено чтение строки, нужно вывести ее

if ReadLength then

begin

LogMessage('Получена строка: ' + Str);

BytesLeft := SizeOf(Integer);

// Формируем ответ и записываем его в буфер

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

Средневековая история. Тетралогия

Гончарова Галина Дмитриевна
Средневековая история
Фантастика:
фэнтези
попаданцы
9.16
рейтинг книги
Средневековая история. Тетралогия

Хозяйка Междуречья

Алеева Елена
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Хозяйка Междуречья

Назад в СССР 5

Дамиров Рафаэль
5. Курсант
Фантастика:
попаданцы
альтернативная история
6.64
рейтинг книги
Назад в СССР 5

Столичный доктор. Том II

Вязовский Алексей
2. Столичный доктор
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Столичный доктор. Том II

Игрок, забравшийся на вершину. Том 8

Михалек Дмитрий Владимирович
8. Игрок, забравшийся на вершину
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Игрок, забравшийся на вершину. Том 8

Довлатов. Сонный лекарь

Голд Джон
1. Не вывожу
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Довлатов. Сонный лекарь

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9

Система Возвышения. Второй Том. Часть 1

Раздоров Николай
2. Система Возвышения
Фантастика:
фэнтези
7.92
рейтинг книги
Система Возвышения. Второй Том. Часть 1

Чужое наследие

Кораблев Родион
3. Другая сторона
Фантастика:
боевая фантастика
8.47
рейтинг книги
Чужое наследие

Князь Мещерский

Дроздов Анатолий Федорович
3. Зауряд-врач
Фантастика:
альтернативная история
8.35
рейтинг книги
Князь Мещерский

Совок 2

Агарев Вадим
2. Совок
Фантастика:
альтернативная история
7.61
рейтинг книги
Совок 2

Царь поневоле. Том 2

Распопов Дмитрий Викторович
5. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Царь поневоле. Том 2

Система Возвышения. (цикл 1-8) - Николай Раздоров

Раздоров Николай
Система Возвышения
Фантастика:
боевая фантастика
4.65
рейтинг книги
Система Возвышения. (цикл 1-8) - Николай Раздоров

Системный Нуб

Тактарин Ринат
1. Ловец душ
Фантастика:
боевая фантастика
рпг
5.00
рейтинг книги
Системный Нуб