gpt4 book ai didi

sockets - recv函数不能接收所有字节

转载 作者:行者123 更新时间:2023-12-03 18:45:24 24 4
gpt4 key购买 nike

我正在使用delphi(RAD Studio 10)制作一个小的应用程序客户端和服务器。服务器仅发送文本。

下一个函数正确返回发送的字节数。例如,我发送“hello”(客户端):

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,发送的字节数('hello + 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 var包括在内,仅用于调试程序)。当我调试时获得以下结果:
Buff = {'h', #0, 'e', #0, 'l', #0, 'l'}(7个字节),下一次执行此行 recv(FSocket, Buffer, Len, 0)时,程序什么都不做,我想这是因为recv函数什么也没接收(发送了7个字节)。

我需要帮助以确保正确接收所有字节。我不知道为什么他们要按这个顺序( h-#0-e-#0-l-#0-l)。

最佳答案

从RAD Studio 2009开始,stringWideChar字符组成。 CharWideChar的别名,为16位。 Length()函数返回字符数,而不是字节数。

您可能要考虑使用TEncoding将字符串转换为TBytes(array of byte)发送,反之亦然。我不知道您的TTCPConnection类,因此可能是您需要对代码进行tweek,但是这里是使用TEncoding.UTF8进行发送的部分:

procedure TTCPConnection.Write(S: String);
var buff : TBytes;
begin
buff := TEncoding.UTF8.GetBytes(S+EOL); // Convert to bytes using UTF8 encoding
WriteBuffer(buff, Length(buff));
end;

这是我在XE5中使用 TTcpServer组件的测试项目中的接收器代码
procedure TForm3.TcpServer1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
var
a: array[0..255] of byte;
b: TBytes;
i, n: integer;
s: string;
begin
n := ClientSocket.ReceiveBuf(a,255,0);
SetLength(b, n);
for i := Low(b) to High(b) do b[i] := a[i]; // copy from the receive buffer
s := TEncoding.UTF8.GetString(b); // convert UTF8 bytes to string
Memo1.Lines.Add(format('%4d %s',[n,s]));
end;

最后是指向文档的一些有用链接:

TEncoding

UTF-8 Conversion Routines

关于sockets - recv函数不能接收所有字节,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35532493/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com