【发布时间】:2017-02-20 09:58:25
【问题描述】:
public class RCon
{
static readonly ConcurrentQueue<byte[]> ReceivedPacketQueue = new ConcurrentQueue<byte[]>();
static IPEndPoint _ipEndPoint = new IPEndPoint(IPAddress.Parse("10.XXX.XX.117"), 2222);
static void Main(string[] args)
{
var client = new UdpClient
{
ExclusiveAddressUse = false,
Client = { ReceiveBufferSize = 8192 }
};
client.Client.Bind(_ipEndPoint);
client.BeginReceive(OnUdpData, client);
var message = new byte[100];
int numberOfPackets ;
for (numberOfPackets = 0; numberOfPackets < 84; numberOfPackets++)
{
client.Send(message, message.Length, _ipEndPoint);
}
}
static void OnUdpData(IAsyncResult result)
{
var socket = result.AsyncState as UdpClient;
var message = socket.EndReceive(result, ref _ipEndPoint);
ReceivedPacketQueue.Enqueue(message);
socket.BeginReceive(OnUdpData, socket);
}
}
我写了一个简单的程序,它发送 100 字节的数据包,并且与服务器相同的机器异步接收数据包并存储在队列中。收到的数据包很好,直到数据包数量为 83 一旦我开始增加超过 84 个数据包的数量,接收数据包的速率就会下降。据我了解,这是因为客户端读取传入数据包的速度不够快,并且由于缓冲区溢出,数据包正在丢失。有什么方法可以让服务器足够快地接收快速传入的数据包。
有类似的问题C# UDP packetloss though all packets arrive (WireShark) 我想我正在按照建议的答案做,但问题仍然存在。
【问题讨论】:
-
看起来你向自己发送消息 - 从 ip 10.170.25.117:2222 到 ip 10.170.25.117:222,实际上我不知道在这种情况下它会如何工作尝试设置两个发送并将缓冲区接收到最大值,即 65536
-
谢谢德米特里。是的,同一台机器充当服务器和客户端。即使我设置为最大缓冲区大小并增加数据包的速率(从 84 到 1200 或更大的数量),我也会开始丢失数据包,因为读取速度不够快并且会发生溢出缓冲区。我的问题是我可以以任何方式改进异步开始接收(OnUdpData)代码以加快数据包的读取速度。