读书人

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

发布时间: 2014-01-21 00:35:39 作者: rapoo

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%能成功的,和网络环境也有关系
[解决办法]
历史原因,没得破。只能自己写个校正,让服务器重发。
[解决办法]
应该采用多线程机制,一条线程专注于接收数据并缓存,另一条线程从缓存中取数据->存储->清理。

读书人网 >C#

热点推荐