О чём не пишут в книгах по 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
рейтинг книги
Столичный доктор. Том II
2. Столичный доктор
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Игрок, забравшийся на вершину. Том 8
8. Игрок, забравшийся на вершину
Фантастика:
фэнтези
рпг
5.00
рейтинг книги
Довлатов. Сонный лекарь
1. Не вывожу
Фантастика:
альтернативная история
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 9
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Система Возвышения. Второй Том. Часть 1
2. Система Возвышения
Фантастика:
фэнтези
7.92
рейтинг книги
Чужое наследие
3. Другая сторона
Фантастика:
боевая фантастика
8.47
рейтинг книги
Князь Мещерский
3. Зауряд-врач
Фантастика:
альтернативная история
8.35
рейтинг книги
Совок 2
2. Совок
Фантастика:
альтернативная история
7.61
рейтинг книги
Царь поневоле. Том 2
5. Фараон
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Система Возвышения. (цикл 1-8) - Николай Раздоров
Система Возвышения
Фантастика:
боевая фантастика
4.65
рейтинг книги
Системный Нуб
1. Ловец душ
Фантастика:
боевая фантастика
рпг
5.00