さまざまなクライアントからUDPパケットを受信し、それらを他のクライアントに転送する必要があるUDPサーバーを作成しています。私はC#を使用しているので、各UDPソケットは私にとってUdpClientです。2つのUdpClientオブジェクトが必要だと思います。1つは受信用、もう1つは送信用です。受信ソケットは既知のポートにバインドされ、送信者はまったくバインドされません。
サーバーは各パケットを取得し、パケットデータでユーザー名を検索し、サーバーが維持しているルーティングリストに基づいて、パケットを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);
}
サーバーは1秒あたり数百のパケットを処理する必要があります(これはVOIP用です)。私がよくわからない主な部分は、上記の「各クライアントに送信」の部分で何をするかです。または使用する必要がありますUdpClient.Send
かUdpClient.BeginSend
?これはリアルタイムプロトコル用であるため、特定のクライアントに対して複数の送信を保留/バッファリングすることは意味がありません。
一度に投稿されるBeginReceive()は1つだけなので、OnUDPRead関数がすでに実行されている間は呼び出されないと思います。UdpClientがこの領域でTcpClientとは異なる動作をしない限り?私はそれに単一のバッファーを与えないので(私はそれにバッファーを与えません)、1つのBeginReceiveが投稿されただけでOnUDPReadを数回起動できると思いますか?