【发布时间】:2012-02-07 16:29:28
【问题描述】:
我最近一直在使用 UDP 套接字。我读过UDP没有内部缓冲区。这意味着如果一个数据包到达并且没有人在等待它,它就会被丢弃。我想到了一种不太可能发生的情况。但如果发生,可能会导致问题。
byte[] buffer = new byte[1024];
Socket socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Bind(...);
while (true)
{
EndPoint remote = new IPEndPoint(IPAddress.Any, 0);
socket.ReceiveFrom(buffer, ref remote);
socket.SendTo(remote, new byte[] { 1, 2, 3, 4 });
}
如果在执行 SendTo 时,这是一个非异步方法(因此它会阻塞它运行的线程,直到它完成,即完成发送数据),另一个来自不同主机的数据包到达?由于没有执行 ReceiveFrom 方法,数据包会被转储吗?
假设“是”,我已经考虑过使用异步套接字。它看起来像这样:
Socket socket;
byte[] buffer;
void StartServer()
{
buffer = new byte[1024];
socket = new Socket(AddressFamily.InterNetwork, SocketType.Dgram, ProtocolType.Udp);
socket.Bind(...);
EndPoint remote = new IPEndPoint(IPAddress.Any, 0);
StartReceive();
}
void StartReceive()
{
socket.BeginReceiveFrom(buffer, 0, buffer.Size, SocketFlags.None, ref remote, OnReceive, null);
}
void OnReceive(IAsyncState state)
{
EndPoint epRemote = new IPEndPoint(IPAddress.Any, 0);
socket.EndReceiveFrom(state, ref epRemote);
socket.BeginSendTo(new byte[] { 1, 2, 3, 4 }, 0, 4, SocketFlags.None, epRemote, null, null);
StartReceive();
}
当 onReceive 方法被 socket.BeginReceiveFrom 调用时,它的代码被执行。由于此代码使用 BeginSendTo,因此它不会阻塞线程。但是如果数据包在 OnReceive 调用 StartReceive 之前到达怎么办?它会丢失吗?
所以我的问题: UDP 数据包是否被缓冲,如果是,缓冲多长时间?
【问题讨论】:
标签: c# sockets asynchronous udp buffer