gpt4 book ai didi

delphi - 首次读取 TcpServer 后接收缓冲区数据丢失

转载 作者:可可西里 更新时间:2023-11-01 02:39:43 25 4
gpt4 key购买 nike

我尝试在客户端发送长度小于 255 的数据。

我尝试使用此协议(protocol)发送数据:

Lenghth+String
Byte+string
sample :
string = ABCD
sentdata = 4ABCD

这是我的服务器端代码:

procedure TfrmServer.tcpsrvr1Accept(Sender: TObject;
ClientSocket: TCustomIpClient);
var
a : array of byte;
I : Cardinal;
mystr : string;
b,Len : Byte;
begin
ClientSocket.ReceiveBuf(b,1,0);// first try : get lenght
Len := b;
SetLength(a,Len+1);
mmoRerult.Lines.Add(DateTimeToStr(now) + ' Data Len ' +
IntToStr(Len));
ClientSocket.ReceiveBuf(a,Len,0); // second try : this lone is not worked.

mystr := '';
for I := 1 to 10 do
begin
mystr := mystr + Chr(a[i]);
end;
mmoRerult.Lines.Add(mystr);
//Creating a stream
mmoRerult.Lines.Add('--------------------');

end;

问题是如果我在第一个可能的first try中读取所有数据,但是如果我在second try中读取数据是不可能的,不可能意味着数据不是正确,我认为读指针是前面的,但我该如何重置。

ClientSocket.BytesReceived 不给我读取前收到的字节数。

我该如何解决这个问题,请不要告诉我首先读取 255 字节,我知道这种方式。

最佳答案

您正在将数据读入指针而不是缓冲区。像这样修复它:

ClientSocket.ReceiveBuf(pointer(a)^,Len,0);

请注意,直接读入 AnsiString 变量会容易得多。

var
str: AnsiString;
....
SetLength(str, Len);
ClientSocket.ReceiveBuf(pointer(str)^,Len,0);

关于delphi - 首次读取 TcpServer 后接收缓冲区数据丢失,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18904494/

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