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

色郎中 2014-01-15 10:28:14
服务端的代码:


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个客户端的数据包(比如两个客户端同一时刻发数据包过来)

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

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




...全文
221 点赞 收藏 6
写回复
6 条回复
Code従業員 2014年01月15日
历史原因,没得破。只能自己写个校正,让服务器重发。
回复 点赞
编程有钱人了 2014年01月15日
首先UDP(就是不可靠的) UDP是OSI参考模型中一种无连接的传输层协议,它主要用于不要求分组顺序到达的传输中,分组传输顺序的检查与排序由应用层完成[1],提供面向事务的简单不可靠信息传送服务 即便是TCP(理论上是可靠的) 也不是100%能成功的,和网络环境也有关系
回复 点赞
是时候重装系统了 2014年01月15日
UDP 本身就丢包,
回复 点赞
mjp1234airen4385 2014年01月15日
1.UPD本来就丢包,是不可靠协议,如果你要保证数据不丢失要使用tcp协议。 2.根据服务器的性能,50/s的并发数,也许是你服务器性能到瓶颈了。
回复 点赞
therry_ding 2014年01月15日
应该采用多线程机制,一条线程专注于接收数据并缓存,另一条线程从缓存中取数据->存储->清理。
回复 点赞
色郎中 2014年01月15日
这个是调用LOG4NET的方法:
log.Info(message);
如果单纯的只打印到控制台上,或只单纯的写入 LOG文件,,即服务端不同时做多个执行动作 是不是会好一些 觉得 这个是调用LOG4NET的方法:
log.Info(message);
消耗不少时间 或者有没有这样的可能 弄两个线程 一个只接受数据,并尽量的缓存 另个线程 去处理
回复 点赞
发动态
发帖子
C#
创建于2007-09-28

8.4w+

社区成员

64.0w+

社区内容

.NET技术 C#
社区公告
暂无公告