日期:2014-05-18  浏览次数:20863 次

C# UDP结婚搜丢包问题
先说说 机器之间配置吧:

总共有个8个机器给 我发数据。给我指定的同一个端口发送数据。

其中1,2,3,4机基本上同时给我发送数据。

发送一帧数据大小大概为8k-9k之间。
wireshark抓包看 可以接收到数据。
当我们程序中却丢包。

我的程序大概设计思路这样。

Udp接受程序,先把接受的数据放到缓存里,然后隔1ms就往
应用传送。接着应用先把传送过来的数据放到自己缓存区里。
初始化操作如下:
IPAddress localIPAddress = IPAddress.Parse(localIP);
IPEndPoint localIPEndPoint = new IPEndPoint(localIPAddress, localPort);

udpReceiveSocket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
udpReceiveSocket.Bind(localIPEndPoint);//绑定本机IP端口
receiveDataThread = new Thread(ReceiveData);
receiveDataThread.IsBackground = true;
receiveDataThread.Priority = ThreadPriority.AboveNormal;
receiveDataThread.Start();


然后接受进程
byte[] receiveBuff = new byte[this.receiveBufferSize]; //定义接收缓冲区
IPEndPoint sourceIPEndPoint= new IPEndPoint(IPAddress.Any, 0);
EndPoint sourceEndPoint = (EndPoint)sourceIPEndPoint;

Int32 dataLen = udpReceiveSocket.ReceiveFrom(receiveBuff, ref sourceEndPoint);
DateTime revDateTime = DateTime.Now;//记录接收到数据时的日期时间
if (dataLen > 0)
{
  UdpReceiveDataClass udpRecvDataCls = new UdpReceiveDataClass();
  udpRecvDataCls.SourceIP = ((IPEndPoint)sourceEndPoint).Address.ToString();
  udpRecvDataCls.Port = ((IPEndPoint)sourceEndPoint).Port;
  udpRecvDataCls.RecvTime = revDateTime;
  udpRecvDataCls.RevDataBytes = new byte[dataLen];
  Array.Copy(receiveBuff, udpRecvDataCls.RevDataBytes, dataLen);

  lock (udpReceiveDataClassListLocker)
  {
  udpReceiveDataClassList.Add(udpRecvDataCls);
  }
 }
  else
  {
  //添加测试相关代码
  }

------解决方案--------------------
解决不了。

帮忙顶顶···········
------解决方案--------------------
帮顶 等高人 接分
------解决方案--------------------
udp丢包50%也是很正常的,这根本就不是可靠通信。想要可靠(但也不是100%不丢包),应该使用tcp。
------解决方案--------------------
赶紧换成Tcp,udp不可靠协议经常丢。
------解决方案--------------------
Friendly Up!
------解决方案--------------------
做到谁发送谁检查是否收到包即可...当A发一个包后..间隔1秒或长点时间还没收到回包时,视为丢包.重新发送请求.
------解决方案--------------------
帮顶,我最近也在搞 UDP采集实时数据的东西,现在数据量不大还比较稳定,同担心点数增加很大后会出现问题啊
------解决方案--------------------
udp不丢包,就不是udp。
------解决方案--------------------
dup丢包才是正常的,不丢才不正常。
一定要做好校验,丢了以后再发送。
可以考虑使用rtp。
rtp:一种基于udp的协议。做了校验、重发等动作。
比udp复杂,需要花费精力去研究的。
------解决方案--------------------
减少丢包率
1、每个UDP包的体积小,小于460个字节,减少分片,从一定程度上可以减少丢包
2、提高接受缓冲区的大小,把接受缓冲设为10K以上
3、采用一问一答,每个包编号,自己采用一套机制,但是这样就太复杂。


------解决方案--------------------
tcp异步传输?话说tcp自称可靠,我怎么试验得不稳定啊..。
------解决方案--------------------
探讨
若丢包不怎么频繁,也能接受,比如说30分 中 丢包1次 2 次之类的。

------解决方案--------------------
环境允许,项目允许。
强烈建议使用TCP

------解决方案--------------------