О чём не пишут в книгах по Delphi
Шрифт:
ServerForm.RemoveConnection(Connection);
Exit;
end;
// Уменьшаем число оставшихся к чтению байтов
// на размер полученных данных
Dec(Connection.BytesLeft, cdTransferred);
if Connection.BytesLeft < 0 then
// Страховка от "тупой" ошибки
ServerForm.AddMessageToLog('Клиент ' + Connection.ClientAddr +
' -
внутренняя ошибка программы: получено больше байтов, ' +
'чем ожидалось');
ServerForm.RemoveConnection(Connection);
end
else if Connection.BytesLeft = 0 then
begin
// Длина строки прочитана целиком
if Connection.MsgSize <= 0 then
begin
ServerForm.AddMessageToLog('Клиент ' + Connection.ClientAddr +
' — получена неверная длина строки ' +
IntToStr(Conneсtion.MsgSizе));
ServerForm.RemoveConnection(Connection);
Exit;
end;
// Делаем строку нужной длины
SetLength(Connection.Msg, Connection.MsgSize);
// Данные пока не прочитаны, поэтому смещение - ноль,
// осталось прочитать полную длину.
Connection.Offset := 0;
Connection.BytesLeft := Connection.MsgSize;
// Заносим размер буфера и указатель на него в Buf.
// Данные будут складываться в строку,
// на которую ссылается Connection.Msg.
Buf.Len := Connection.MsgSize;
Buf.Buf := Pointer(Connection.Msg);
// Вызываем WSARecv для чтения самой строки
Flags := 0;
if WSARecv(Connect ion.ClientSocket, @Buf, 1, NumBytes, Flags,
@Connection.Overlapped, ReadMsgCompleted) = SOCKET_ERROR then
begin
if WSAGetLastError <> WSA_IO_PENDING then
begin
ServerForm.AddMessageToLog('Клиент ' + Connection.ClientAddr +
' - ошибка при чтении строки: ' + GetErrorString(dwError));
ServerForm.RemoveConnection(Connection);
end;
end;
end
else
begin
// Connection.BytesLeft < 0 -
длина строки
// прочитана не до конца.
// Увеличиваем смещение на число прочитанных байтов
Inc(Connection.Offset, cdTransferred);
// Формируем буфер для чтения оставшейся части длины
Buf.Len := Connection.BytesLeft;
Buf.Buf := PChar(@Connection.MsgSize) + Connection.Offset;
// вызываем WSARecv для чтения оставшейся части длины строки
Flags := 0;
if WSARecv(Connection.ClientSocket, @Buf, 1, NumBytes, Flags,
@Connection.Overlapped, ReadMsgCompleted) = SOCKET_ERROR then
begin
if WSAGetLastError <> WSA_IO_PENDING then
begin
ServerForm.AddMessageToLog('Клиент ' + Connection.ClientAddr +
' - ошибка при чтении длины строки: ' +
GetErrorString(dwError));
ServerForm.RemoveConnection(Connection);
end;
end;
end;
end;
// Функция ReadMsgCompleted используется в качестве функции завершения
// для перекрытого чтения строки.
// Она во многом аналогична функции ReadLenCompleted
procedure ReadMsgCompleted(dwError: DWORD; cdTransferred: DWORD; lpOverlapped: PWSAOverlapped; dwFlags: DWORD); stdcall;
var
Connection: PConnection;
Buf: TWSABuf;
NumBytes, Flags: DWORD;
begin
Connection := ServerForm.GetConnectionByOverlapped(lpOverlapped);
if Connection = nil then
begin
ServerForm.AddMessageToLog(
'Внутренняя ошибка программы - не найдено соединение');
Exit;
end;
if dwError <> 0 then
begin
ServerForm.AddMessageToLog('Клиент ' + Connection.ClientAddr +
' ошибка при чтении строки: ' + GetErrorString(dwError));
ServerForm.RemoveConnection(Connection);
Exit;
end;
Dec(Connection.BytesLeft, cdTransferred);
Поделиться:
Популярные книги
Шесть тайных свиданий мисс Недотроги
Любовные романы:
любовно-фантастические романы
эро литература
7.75
рейтинг книги
Я еще не барон
1. Дорогой барон!
Фантастика:
боевая фантастика
попаданцы
аниме
5.00
рейтинг книги
Седьмая жена короля
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Не верь мне
7. Самбисты
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Газлайтер. Том 12
12. История Телепата
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Жандарм
1. Жандарм
Фантастика:
попаданцы
альтернативная история
аниме
4.11
рейтинг книги
Архонт
5. Стеллар
Фантастика:
боевая фантастика
рпг
7.80
рейтинг книги
Волк 7: Лихие 90-е
7. Волков
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Целитель
1. Целитель
Фантастика:
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXIV
24. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Менталист. Конфронтация
2. Выиграть у времени
Фантастика:
боевая фантастика
6.90
рейтинг книги
Восход. Солнцев. Книга IX
9. Голос Бога
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Сломанная кукла
5. Серьёзные мальчики в форме
Любовные романы:
современные любовные романы
5.00
рейтинг книги
Свет во мраке
8. Изгой
Фантастика:
фэнтези
7.30