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

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

Жанры

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

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

70 Рублей

Кожевников Павел
1. 70 Рублей
Фантастика:
фэнтези
боевая фантастика
попаданцы
постапокалипсис
6.00
рейтинг книги
70 Рублей

Жатва душ. Остров мертвых

Сугралинов Данияр
Фантастика:
боевая фантастика
рпг
5.20
рейтинг книги
Жатва душ. Остров мертвых

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

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

Как я строил магическую империю 6

Зубов Константин
6. Как я строил магическую империю
Фантастика:
попаданцы
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Как я строил магическую империю 6

Леди для короля. Оборотная сторона короны

Воронцова Александра
3. Королевская охота
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Леди для короля. Оборотная сторона короны

Кодекс Крови. Книга VI

Борзых М.
6. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Крови. Книга VI

Газлайтер. Том 4

Володин Григорий
4. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 4

АллатРа

Новых Анастасия
Научно-образовательная:
психология
история
философия
обществознание
физика
6.25
рейтинг книги
АллатРа

Газлайтер. Том 10

Володин Григорий
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Газлайтер. Том 10

Дорога к счастью

Меллер Юлия Викторовна
Любовные романы:
любовно-фантастические романы
6.11
рейтинг книги
Дорога к счастью

Газлайтер. Том 8

Володин Григорий
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Газлайтер. Том 8

Камень Книга седьмая

Минин Станислав
7. Камень
Фантастика:
фэнтези
боевая фантастика
6.22
рейтинг книги
Камень Книга седьмая

Николай I Освободитель. Книга 2

Савинков Андрей Николаевич
2. Николай I
Фантастика:
героическая фантастика
альтернативная история
5.00
рейтинг книги
Николай I Освободитель. Книга 2

Секретарша генерального

Зайцева Мария
Любовные романы:
современные любовные романы
эро литература
короткие любовные романы
8.46
рейтинг книги
Секретарша генерального