Я использую delphi (RAD Studio 10), чтобы сделать небольшой клиент и сервер приложений. Сервер отправляет только текст.Функция recv не принимает все байты
Следующие функции правильно возвращают количество отправленных байтов. Например, я отправить 'привет' (на стороне клиента):
procedure TTCPConnection.Write(S: String);
var buff : string;
begin
buff = S+EOL;
WriteBuffer(buff, Length(buff));
end;
Где: S = 'hello'
и EOL = #13#10
, так buff = 'hello'+EOL
.
procedure TTCPConnection.WriteBuffer(var Buffer; const Len: Cardinal);
var
a : Int16;
begin
a := send(FSocket, Buffer, Len, 0);
if (a = SOCKET_ERROR) and FConnected then
begin
HandleError;
Disconnect;
end;
end;
в предыдущей функции: send(FSocket, Buffer, Len, 0)
возвращение 7, количество отправленных байт ('привет + EOL').
стороне сервера:
function TTCPConnection.ReadLn(Delim: String = EOL): String;
const BUFFER_SIZE = 255;
var
Buff, Buf: string;
I, L: Cardinal;
begin
Result := '';
I := 1;
L := 1;
SetLength(Buff, BUFFER_SIZE);
Buf := AnsiString(Buff);
while Connected and (L <= Cardinal(Length(Delim))) do
begin
if recv(FSocket, Buffer, Len, 0) < 1 then exit;
Buf := Buff[I];
if Buff[I] = Delim[L] then
...
...
end;
(В предыдущем коде я включаю Buf
вар для целей отладчика только). Когда я отлаживаю полученный результат:
Buff = {'h', #0, 'e', #0, 'l', #0, 'l'}
(7 байт), а в следующий раз, когда эта строка выполнена, программа ничего не делает, я думаю, это потому, что функция recv ничего не получает (отправлено 7 байт).
Мне нужна помощь, чтобы все байты были получены правильно. Я не знаю, почему они в этом порядке (h-#0-e-#0-l-#0-l
).
Спасибо. теперь функция recv получает полную информацию 'Buff = {'h', # 0, 'e', # 0, 'l', # 0, 'l', # 0, 'o', '$ D', # 0, '$ A'} '. Теперь, я должен построить новый буфер без' # 0'? или я делаю что-то неправильно, что не показано так, как должно быть? ('Buff = {'h', 'e', 'l', 'l', 'o', '$ D', '$ A'}') – Jota69
@Tom Ни один из ваших вариантов не является хорошим. С UTF16 вам нужно заняться контентом. Если вы хотите избежать использования 8-разрядной кодировки Unicode, UTF8. –
@ Jota69 Вам нужно прекратить отправку текста и начать думать о кодировании текста как двоичного кода в определенной кодировке. UTF8 - лучший выбор. –