当clientsocket收到数据后,怎么样清空缓冲区啊?(50分)

  • 主题发起人 哈利波特
  • 开始时间

哈利波特

Unregistered / Unconfirmed
GUEST, unregistred user!
我用serversocket向clientsocket发数据
用了循环即 for i:=0 to 2 do
serversocket.socket.sendtext(.....)
当clientsocket收到数据时总是收到所有循环后的数据,我想美接收一次数据后,就把缓冲区
中的数据清空,不知道该怎么做
 
你的发送语句不正确,应该 serversocket1.Socket.Connections.SendText
如果想单发,可通过ip地址和端口来共同决定!
至于清缓冲区数据,你可通过指针指向缓冲区,然后取出数据后,在通过指针清除就的了
 
根本不可能的clientsocket,serversocket默认是无阻塞方式接收,对于同一个套接字
你发的很快,或者接收方太慢都会出现数据连在一起的情况,
我的解决方法是:1:发送的字符用特殊的字符分割(例如chr(0)),接收时拆开来
2:用indy控件(它是阻塞方式的)
目前我两种都用过(分别应用于两个项目,工作良好)
 
不用清空的,你看原代码,DELPHI是用setlength()来分配内存的,所以这个时候
缓冲是空的。
 
同意楼上
 
不是程序的问题,本来TCP/IP就是这样的,有粘包现象
 
贴出源码:
procedure Tfrm_main.ServerSocket1ClientRead(Sender: TObject;
Socket: TCustomWinSocket);
var
re:pchar;
sbuf:string;
ip,name:string;
i:integer;
count:integer;
begin
re:=nil;
while socket.receivelength>0 do
begin
re:=allocmem(socket.ReceiveLength);
try
socket.ReceiveBuf(re^,socket.receivelength);
sbuf:=strpas(re);
finally
freemem(re);
end;
end;
if pos('logo',sbuf)>0 then
begin
i:=pos('@',sbuf);
name:=copy(sbuf,5,i-5);
ip:=copy(sbuf,i+1,length(sbuf)-i);
try
adodataset1.Open;
adodataset1.Insert;
adodataset1.FieldByName('ip').AsString:=ip;
adodataset1.FieldByName('name').AsString:=name;
adodataset1.Post;
adodataset1.Close;
except
messagebox(0,'未知错误!','错误',mb_ok);
end;
count:=serversocket1.Socket.ActiveConnections;
for i:=1 to count-1 do
begin
adodataset1.Open;
while not adodataset1.Eof do
begin
serversocket1.Socket.Connections.SendText('client'+adodataset1.Fieldbyname('name').asstring);
//上面这句
adodataset1.Next;
end;
adodataset1.Close;
end;
end;
if pos('down',sbuf)>0 then
begin
name:=copy(sbuf,5,length(sbuf)-4);
adodataset1.Open;
adodataset1.Locate('name',name,[]);
adodataset1.Delete;
adodataset1.Close;
end;

end;
 
你觉得学习Delphi好学吗
 
顶部