首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > .NET > C# >

UDP 服务端 丢包紧急 ,30%左右的丢包率.

2014-01-21 
UDP 服务端 丢包严重 ,30%左右的丢包率...服务端的代码:static void Main(string[] args){IPHostEntry hos

UDP 服务端 丢包严重 ,30%左右的丢包率...
服务端的代码:


static void Main(string[] args)
        {
            IPHostEntry hostEntry = Dns.GetHostEntry(Dns.GetHostName());
            IPEndPoint endPoint = new IPEndPoint(hostEntry.AddressList[0], 60000);
            Socket s = new Socket(endPoint.Address.AddressFamily,SocketType.Dgram,ProtocolType.Udp);
            IPEndPoint sender = new IPEndPoint(IPAddress.Any, 0);
            EndPoint senderRemote = (EndPoint)sender;
 
            s.Bind(endPoint);
            byte[] msg = new Byte[256];
            Console.ForegroundColor = ConsoleColor.Red;  //设置字体颜色为红色
            Console.WriteLine("Waiting...");
             
            LogMessage message = new LogMessage();
             
            while(true)
            {
                s.ReceiveFrom(msg, ref senderRemote);
                string deviceID = Convert.ToString(msg[5], 16);
                //string rt = byteToHexStr(msg);
                string iPstr = senderRemote.ToString();
                ipStringSplit = iPstr.Split(':') ;
                Console.ForegroundColor = ConsoleColor.Green;                
 
                message.DeviceID = deviceID;
                message.DeviceIP = ipStringSplit[0];
                message.DevicePort =ipStringSplit[1];
                log.Info(message);
            }         
        }


这个是调用LOG4NET的方法:
log.Info(message);


将收到的每个客户端的数据包,执行三个动作
1 打印到控制台
2 写入LOG文件
3 写入数据库

目前测试的效果,发生数据包小于100字节
10Ms  丢包率达到 30%左右
20Ms  不丢
50Ms  不丢
100Ms 不丢

上面每个时间间隔都测试多遍,且都执行三个动作: 打印到控制台,写LOG文件,写数据库

这样算下来,客户端以1秒的间隔发生数据,1秒内 服务端也就处理<50个客户端的数据包(比如两个客户端同一时刻发数据包过来)

若是成千上万的话,就歇菜了....

怎么才能,尽量的处理多大并发请求,且不丢数据包?





[解决办法]
UDP 本身就丢包, 
[解决办法]
首先UDP(就是不可靠的)
UDP是OSI参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成[1],提供面向事务的简单不可靠信息传送服务
即便是TCP(理论上是可靠的) 也不是100%能成功的,和网络环境也有关系
[解决办法]
历史原因,没得破。只能自己写个校正,让服务器重发。
[解决办法]
应该采用多线程机制,一条线程专注于接收数据并缓存,另一条线程从缓存中取数据->存储->清理。

热点排行