使用Socket进行数据传递时,如何进行差错控制(100分)

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

lulp

Unregistered / Unconfirmed
GUEST, unregistred user!
我在用网络中进行数据传递中,使用了Socket,采用流传递的方式,
将文件分成了若干的包进行发送,在传递过程中发现传递数据的错误
率很高,请教各位,如何判断数据的正确性,如何对错误数据进行重
发,如何组合文件?
 
有点象 OSI/RM 的网络层,
是否要用诸如 滑动窗口之类的东西
好怕怕,来听听。
 
你想自己做TCP?
 
加校验位,错了重发
瞎说的,hehe
 
使用Socket? 是使用winsocket 还是什么?
 
用流式socket的话不会出错的,因为TCP协议本身是有差错控制的
如果用UDP的话,倒是会有出错的可能
我怀疑是你的程序有问题
 
将问题提前
 
传文件请用delphi里的fastnet里的NMStrmServ,用法很简单,小弟曾用过,如果你硬件没问题就一定没问题!
 
给包编号,按编号顺序发送接收,由接收方申请有欲接收包的编号,
然后,发送方发该包,如接收方没有收,则继续申请该包。
这样可保证文件的顺序性, 正确性。
 
tcpip是不会错的,除非物理连接断了。
 
lulp老兄:
你的想法是对的,但一般说来,除非是局域网的应用,应该尽量使用tcp。
tcp本身在传输层提供了差错控制和重发。它的原则就是:对于一包数据,
要么client/server成功接收。要么失败。
但我们在tcp上编程时还是要处理重发的
问题的。比如:你要发送一个2m的文件,总不成把打成一个tcp包发过去吧?
其实就是仿照tcp的错误控制和重发做一编:
包号,总包数,重发次数。包格式。数据一般使用CRC校验。

还有一个死锁的问题。要考虑。比如建立连接后的一方崩溃问题。另外一方如何
释放资源。
一个比较笨的办法是为每一包数据建立一次连接。无状态的。这样死锁问题
就交给tcp解决了。但这样的效率太低。
不考虑死锁问题的一般思路如下:
Tcp.connect ;
first : send totals package number to romate IP.
n := 1;
againNum := 0;
while n < totals_num do
begin
packaged_Data(n);// this function must add crc check to data of package;
send_package( n) ;
if send ok -> then
begin
n := n+1;

end
else
begin

againNum := againNum + 1;
if againNum > MaxAgainNum then
exit(0); //error msg show ! exit.
end;
end;
 
接受答案了.
 
后退
顶部