我正在创建一个 UDP 服务器,它需要从各种客户端接收 UDP 数据包,然后将它们转发给其他客户端。我正在使用 C#,所以每个 UDP 套接字对我来说都是一个 UdpClient。我想我想要 2 个 UdpClient 对象,一个用于接收,一个用于发送。接收套接字将绑定到一个已知端口,而发送者根本不会被绑定。
服务器将获取每个数据包,在数据包数据中查找用户名,然后根据服务器维护的路由列表,将数据包转发给 1 个或多个其他客户端。
我开始监听 UdpClient:
UdpClient udpListener = new UdpClient(new IPEndPoint(ListenerIP, UdpListenerPort));
udpListener.BeginReceive(new AsyncCallback(OnUDPRead), udpListener);
我的回调看起来像:
void OnUDPRead(IAsyncResult ar)
{
UdpClient udpListener = (UdpClient)ar.AsyncState;
try
{
IPEndPoint remoteEndPoint = null;
byte[] packet = udpListener.EndReceive(ar, ref remoteEndPoint);
// Get connection based on data in packet
// Get connections routing table (from memory)
// ***Send to each client in routing table***
}
catch (Exception ex)
{
}
udpListener.BeginReceive(new AsyncCallback(OnUDPRead), udpListener);
}
服务器将需要每秒处理 100 个数据包(这是用于 VOIP)。我不确定的主要部分是在上面的“发送给每个客户”部分要做什么。我应该使用UdpClient.Send
orUdpClient.BeginSend
吗?由于这是针对实时协议的,因此为任何给定的客户端设置多个挂起/缓冲的发送是没有意义的。
由于我在任何给定时间只发布了一个 BeginReceive(),我假设我的 OnUDPRead 函数在已经执行时永远不会被调用。除非 UdpClient 在这方面的工作方式与 TcpClient 不同?由于我没有给它一个缓冲区(我没有给它任何缓冲区),我想它可以在只发布一个 BeginReceive 的情况下多次触发 OnUDPRead?