我用socket非阻塞接收数据时,出现在数据包中部分数据丢失?(50分)

  • 主题发起人 主题发起人 wz_lizard
  • 开始时间 开始时间
W

wz_lizard

Unregistered / Unconfirmed
GUEST, unregistred user!
我用socket的非阻塞的方式,做一个服务器,客户端用sendtext()来发送数据,每次发送一个数据包,当服务器端在接收大量的数据时,在些时如果用鼠标来快速的移动服务器程序的窗体时,接到到的数据有时,好几个包并成一个包,有时一人包中部分数据丢失
比如,我现在一直发送一个 @ufeu#sefhue#sfeuu# 这样一个数据包
有时会是一个包里有好几个 @ufeu#sefhue#sfeuu#@ufeu#sefhue#sfeuu#
有时包里的一些数据被覆盖 @ufeu#sef@ufeu#sefhue#sfeuu#
 
最简单的办法(也最无耻^_^):每次发送后都延迟一下,如sleep(10)
 
看我的回答
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2103620
 
为你发送的数据定义一个结构,例如
type
SEND=record
DataType:DWORD;//发送数据格式,自定义
DataLength:DWORD;//发送的数据长度
bSend:Boolean;//是否还有数据发送
......
Data:array [0..1] of BYTE;//发送的数据
end;
发送端发送以上数据,接收端接收到该数据后再发送以上格式的数据通知发送端继续发数据,只有这样才不会漏数据或数据重叠,否则100%接收数据失败,除非你收发很慢,建议你去看看CMPP(点对点通讯协议)是怎么定义数据格式的,就是类似上面的定义方式
 
还是用阻塞的好了,保险多了:)
发送或接收时,每1K发送或接收一次,直到完成。我的都这么用,没出现过丢包。
 
to cyradg
如何发送一个记录型的数据,我是用sendtext只能发送文本
有没有例子?zsy_lizard@sina.com
 
用sendbuf
告诉你看我的回答嘛.里面有完整的代码,不丢包的.我拿来实验传文件的
 
to firstrose
你的回答早就看过了,里面没有代码,是不是你发错了?
 
ft,代码应该在
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2136774

顺便说一下,丢包问题参见
http://www.delphibbs.com/delphibbs/dispq.asp?lid=2140583
一般可以解决
 
多人接受答案了。
 
后退
顶部