用TCPClient接收,收到后怎样清空它的缓冲区呢?(100分)

  • 主题发起人 主题发起人 阿蛮
  • 开始时间 开始时间

阿蛮

Unregistered / Unconfirmed
GUEST, unregistred user!
我用TcpClient控件发送与接收,每次正常收到3次左右以后,就总是返回上一次收到的数据,我怎样才能清空它的缓冲区呢?
我的代码如下:
function SendData(s: String): String;
var
st: TStringStream;
buf: array[0..8192] of char;
begin
St:=TStringStream.Create(s+#13);
frmDM.TcpClient.SendStream(St);
frmMain.TcpClient.ReceiveBuf(buf, Length(buf), 0);
result:=Trim(r);
end;
 
断开连接就可以了
 
我晕~~~
我知道这样可以,但我不能这样做,我要一直在线,发送信息完就接收,收完后还要一直在线,等待下一次发送与接收.
 
ZeroMemory(Buf, SizeOf(Buf))
 
St.Free;
ZeroMemory(Buf,SizeOf(Buf)
 
之前有这句:
ZeroMemory(@Buf, SizeOf(Buf));
后来并没有改善就把它拿掉了,现在加上,还是一样.
 
直接用writeln阿。
你创建的东西并不是buf。

给你一个很好用的~也是Indy自己都用的
PRecvBufferCMD=^TRecvBufferCMD;
TRecvBufferCMD=packed record
cmd:char;
len:Cardinal;
Buffer: array [0..256000] of Char;
end;

var FRecvBuf:TIdManagedBuffer;

程序中:
tc:=PRecvBufferCMD(FRecvBuf.Memory);//获取这段数据完整的信息

//下面这个用来判断是否数据是完整的。
function TDecStream.NeedParse: boolean;
var tc:PRecvBufferCMD;
a:array [0..4] of char;
begin
Result:=FALSE;
if FRecvBuf.Size<=0 then exit;
tc:=PRecvBufferCMD(FRecvBuf.Memory);
if tc.len>FRecvBuf.Size then exit;

Result:=TRUE;
end;

//下面这里是读
case tc.cmd of
'R','S':
begin
w:=FDES.DecryptBuffer(tc.buffer,tc.len-5,FBuf);
//Form1.DumpPacket(Form1.memo1,FBuf,w,TRUE);
//Form1.Edit8.Text:=tc.cmd;

if tc.cmd='R' then
Result:=1
else
Result:=2;
FRecvBuf.Remove(tc.len);//移除已经分析的数据。
FRecvBuf.PackBuffer;//重新打包和定位缓冲开头

end;

///下面是数据写入。
var a:array[0..8192] of char;

DecBuf.RecvBuf.Write(a,c);
可以用indy或者ServerSocket来做都可以的。看怎么读好就怎么读。
如果用indy建议用string来读。然后把string写入这个buf.但是要注意string[1]的头,和长度。

超级好用。我拿来写外挂缓冲的。一挂两个星期。内存绝对不长大。
 
看的不是很明白,能详细说一下吗?比如我要把它写到一个函数里去.
 
无人知道吗?
 
超级好用。我拿来写外挂缓冲的。一挂两个星期。内存绝对不长大。
..................厉害,原来还是外挂高手
 
FillMemory(@Buf,0,SizeOf(Buf))
 
加上FillMemory(@Buf,SizeOf(Buf), 0)这句也不管用.
 
还系木有人知道吗?[:(]
 
后退
顶部