О чём не пишут в книгах по Delphi
Шрифт:
if Connection.BytesLeft < 0 then
begin
ServerForm.AddMessageToLog('Клиент ' + Connection.ClientAddr +
' - внутренняя ошибка программы: получено больше байтов, ' +
'чем ожидалось');
ServerForm.RemoveConnection(Connection);
end
else if Connection.BytesLeft = 0 then
begin
//
Строка получена целиком. Выводим ее на экран.
ServerForm.AddMessageToLog('От клиента ' + Connection.ClientAddr +
' получена строка: ' + Connection.Msg);
// Формируем ответ
Connection.Msg :=
AnsiUpperCase(StringReplace(Connection.Msg, #0,
'#0', [rfReplaceAll])) + ' (Overlapped server)'#0;
// Смещение - ноль, осталось отправить полную длину
Connection.Offset := 0;
Connection.BytesLeft := Length(Connection.Msg);
// Формируем буфер из строки Connection.Msg
Buf.Len := Connection.BytesLeft;
Buf.Buf := Point(Connection.Msg);
// Отправляем строку
if WSASend(Connection.ClientSocket, @Buf, 1, NumBytes, 0,
@Connection.Overlapped, SendMsgCompleted) = SOCKET_ERROR then
begin
it WSAGetLastError <> WSA_IO_PENDING then
begin
ServerForm.AddMessageToLog('Клиент ' + Connection.ClientAddr +
' - ошибка при отправке строки: ' + GetErrorString);
ServerForm.RemoveConnection(Connection);
end;
end;
end
else
begin
// Connection.BytesLeft < 0 - строка прочитана частично
Inc(Connection.Offset, cdTransferred);
// Формируем буфер из непрочитанного остатка строки
Buf.Len := Connection.BytesLeft;
Buf.Buf := PChar(Connection.Msg) + Connection.Offset;
// Читаем остаток строки
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);
ServerForm.RemoveConnection(Connection);
end;
end;
end;
end;
// Функция SendMsgCompleted используется в качестве функции завершения
// для перекрытой отправки строки.
// Во многом она аналогична функции ReadLenCompleted
procedure SendMsgCompleted(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);
if Connection.BytesLeft < 0 then
begin
ServerForm.AddMessageToLog('Клиент ' + Connection.ClientAddr +
' — внутренняя ошибка программы: отправлено больше байтов, ' +
'чем ожидалось');
ServerForm.RemoveConnection(Connection);
end
else if Connection.BytesLeft = 0 then
begin
// Строка отправлена целиком. Выводим сообщение об этом.
ServerForm.AddMessageToLog('Клиенту ' + Connection.ClientAddr +
' отправлена строка: ' + Connection.Msg);
// Очищаем строку, чтобы зря не занимала память
Connection.Msg := '';
// Теперь будем снова читать длину строки
Connection.Offset := 0;
Поделиться:
Популярные книги
70 Рублей
1. 70 Рублей
Фантастика:
фэнтези
боевая фантастика
попаданцы
постапокалипсис
6.00
рейтинг книги
Жатва душ. Остров мертвых
Фантастика:
боевая фантастика
рпг
5.20
рейтинг книги
Сердце Дракона. Том 9
9. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.69
рейтинг книги
Как я строил магическую империю 6
6. Как я строил магическую империю
Фантастика:
попаданцы
аниме
фантастика: прочее
фэнтези
5.00
рейтинг книги
Леди для короля. Оборотная сторона короны
3. Королевская охота
Любовные романы:
любовно-фантастические романы
5.00
рейтинг книги
Кодекс Крови. Книга VI
6. РОС: Кодекс Крови
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Газлайтер. Том 4
4. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
АллатРа
Научно-образовательная:
психология
история
философия
обществознание
физика
6.25
рейтинг книги
Газлайтер. Том 10
10. История Телепата
Фантастика:
боевая фантастика
5.00
рейтинг книги
Дорога к счастью
Любовные романы:
любовно-фантастические романы
6.11
рейтинг книги
Газлайтер. Том 8
8. История Телепата
Фантастика:
попаданцы
альтернативная история
аниме
5.00
рейтинг книги
Камень Книга седьмая
7. Камень
Фантастика:
фэнтези
боевая фантастика
6.22
рейтинг книги
Николай I Освободитель. Книга 2
2. Николай I
Фантастика:
героическая фантастика
альтернативная история
5.00
рейтинг книги
Секретарша генерального
Любовные романы:
современные любовные романы
эро литература
короткие любовные романы
8.46