clientsocket 和serversocket的连接丢失数据该如何处理?(100分)

  • 主题发起人 主题发起人 liuyj
  • 开始时间 开始时间
L

liuyj

Unregistered / Unconfirmed
GUEST, unregistred user!
当clientsocket和serversocket连接时,需要在连接成功时发送数据到客户机,我在serversocket的
onaccept事件中编写代码,向clientsocket发送一批数据,连续多次调用sendbuf函数,出现丢失数据,
请教各位,在此情况下如何防止数据丢失?
 
对每次发的数据设一个校验,检查每次发的数据是否有问题。
另一方面,用类似网络数据传输的方法。当clientsocket收到包时向serversocket发确认。
serversocket在一定时间内收不到确认就重发。
 
但当两次发送之间留一定的时间,就不会出现这种情况了,是不是当第一次发送数据包到达
客户机,还没有处理完,第二个数据包又到达,接收缓冲区的数据发生改变呢?如果是这样,
怎样处理?
 
SENDBUF会返回一个数值,表示成功与否,判断一下就可以了,如:
Function TForm_Update.SendParam(Socket:TCustomWinSocket;TheParam:Pointer;Size:integer):Boolean;
var
start:TDateTime;
begin
start:=now;
while Socket.SendBuf(TheParam^,Size)<=0 do
begin
Application.ProcessMessages;
if (now-Start)*100000>Timeout then
begin
Result:=False;
Exit;
end;
end;
Result:=True;
end;
 
有时候接收数据的一端也会出现问题,一般在接收端的两次receivebuf之间加一个硬编码
延迟如:sleep(200),可以消除错误。
 
再设一级缓冲试一试
 
to pingbaoshi:
能说详细一点吗?
关于lanren说的,我编写的接收端是以事件驱动用onread事件,不能用延迟的
 
接收不用延迟的,主要是Socket.SendBuf,发送时返回的是实际发出的BYTE,
否则就是发送失败
 
谢谢大家,已经解决了
 
后退
顶部