大虾,如何才能用udp高速发送数据呢?(100分)

  • 主题发起人 主题发起人 新手
  • 开始时间 开始时间

新手

Unregistered / Unconfirmed
GUEST, unregistred user!
我在100M的局域网中用nmudp控件告诉发送数据,代码如下:
procedure TForm1.Button1Click(Sender: TObject);
var
i: integer;
begin
for i:=1 to 1000 do
begin
nmudp1.SendBuffer(buf,1472);
sleep(1)///->实际上间隔了大约有10毫秒
end;
end;
可是接收端丢失数据是非常频繁的,根本无法接收到所有的数据
小弟已经被折腾的头都大了,都说要在两次发送之中间隔一段时间
,sleep(1)间隔并不是1毫秒,而至少是10毫秒,这样一来,我发送
数据的速度大大降低,离实际要求相差太远,大伙有什么好的意见没?
 
解决数据丢失的方法就是用tcp/ip,这种方式是能够保证正常情况不丢任何数据的,并且
一次发送的数据量也比udp的多很多,用你现在的方式,除非接收处理非常快,否则总会丢数据。
sleep(1)理论上肯定是间隔一个毫秒,但计算机的一个指令周期和其他因素的影响,
一般都要10个毫秒,在unix下也要10个毫秒了,何况在windows下。
 
呵呵,你把每个包拆小,就可以告诉发送数据了
 
采用双通道,一个命令控制通道用TCP连接,数据通道用UDP
在数据包头加入包序列号,这样没有接收到的数据可以利用TCP连接通知重发。
这样既可以保障不丢包,又可以保障高速
 
大家误会我得意思了,我发现即使在100M网络条件下连续发送upd包,接收放还是
要丢包的,只有在间隔一段时间发送,接收放才能全部收到。这种丢包不是在网络
传输过程中丢的,而是让发送端连续发udp包,中间不间隔导致有很多包根本就没有
发送出去。我是想问发送间隔sleep(1)未免有一点奢侈,而且这样导致发送速率
降低的太多,用什么方法代替sleep呢?大家有没有什么好方法?我想的是用一些
稍微用时的循环来做这件事
 
倘若不需要考虑丢包的重发,可以修改如下:
procedure TForm1.Button1Click(Sender: TObject);
var
i,j: integer;
begin
for i:=1 to 1000 div 10 do
begin
for j:=1 to 10 do
nmudp1.SendBuffer(buf,1472);
sleep(1)///->实际上间隔了大约有10毫秒
end;
end;
这样发送速度不就快了10倍?大约可以跑满10M网络。
如果要更快也没问题,倘若要完全避免出现丢包,仍然需要有TCP连接发送命令。
循环的方法肯定不是好方法。
 
难道
for j:=1 to 10 do
nmudp1.sendbuffer(buf,1472);
就不会丢包了?
 
如果发送比接收快,udp方式是会丢包的,因为upd永远不能保证不丢包。
 
to:新手
问个问题,你怎么就肯定是发送时丢的呢?你有没有监测过,你怎么知道不是
接收速度慢导致的呢?
 
接收端接收速度慢确实导致丢包
我疏忽了
谢谢各位
 
多人接受答案了。
 
后退
顶部