使用 UDP 发送图片,总是要掉包,该如何解决?(100)

J

jrmd

Unregistered / Unconfirmed
GUEST, unregistred user!
我的程序是一个 C/S 架构的小程序,服务器端定期截屏,然后把截屏的图像传送到客户端。因为 Delphi 的 TNMUDP.SendBuffer() 每次只能发送 2K 的数据,多了发送操作就要失败,所以我的算法是:将每幅图像的数据分成多个帧,客户端接收到所有帧后再组合,组合完成后,再回显图像。// 帧是这样定义的:type PDataGramFrame = ^TDataGramFrame; TDataGramFrame = Record TotalLength: integer; // 数据报总长度 LengthOfCurFrame: integer; // 当前帧长度 IsLastFrame: Boolean; // 最后一帧? Data: array[0..SIZEOFPERFRAME-1] of char; // 数据区 end;现在有一个非常尴尬的问题:UDP 传送数据并不可靠!请见【图1】(论坛不能上传图片,我只好把图片放到了我的QQ空间里):kjt1BtJILEZ85_M_YPZJQsPl0D-ZWAQU.jpeg服务器端截屏后将图像分解成58帧,并发送到客户端。可是,客户端在接收时第16 - 20帧、第22帧都丢失了,因接收到的图像数据不完整,导致客户端无法回显图像。各位朋友,这个问题该如何解决呢?难道传送截屏图像到对端,必须使用 TCP 连接吗?
 
最后编辑:
C

cqwty

Unregistered / Unconfirmed
GUEST, unregistred user!
既然有掉包,那就要自己实现确认机制啊。你一张图片分成多个数据包来传送,然后每个数据包都给一个序号,如果收到了,那么接收端就给发送端发一个确认收到的确认包。如果发送端没有收到相应的确认包,那就重复发送,比如说发送3次,只要收到对应的确认包,那就停止发送这个包了。这样就可以保证接收端能接收到。另外,为了保证数据包中的图片信息没有发生错误,那么最好再加入crc校验,如果校验不对,那么就说明这个数据包有问题,就可以请求发送端再次发送对应的这个数据包。直到所有的数据包都正确收到了,才解析出来,在接收端还原成图片。
 

张辉明

Unregistered / Unconfirmed
GUEST, unregistred user!
2K的包已经大了点,1K多要好点。
 
A

aerobull

Unregistered / Unconfirmed
GUEST, unregistred user!
现在有一个非常尴尬的问题:UDP 传送数据并不可靠!=======现在有一个非常明确的答案,udp传输可以做得可靠.
 

Similar threads

S
回复
0
查看
1K
SUNSTONE的Delphi笔记
S
S
回复
0
查看
935
SUNSTONE的Delphi笔记
S
S
回复
0
查看
2K
SUNSTONE的Delphi笔记
S
顶部