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