web-dev-qa-db-ja.com

udpClientを使用して継続的にメッセージを受信する

C#UdpClientクラスを介してメッセージを受信および処理するための最適なソリューションを探していました。誰にもこれに対する解決策はありますか?

22
Saanch

このコードを試してください:

//Client uses as receive udp client
UdpClient Client = new UdpClient(Port);

try
{
     Client.BeginReceive(new AsyncCallback(recv), null);
}
catch(Exception e)
{
     MessageBox.Show(e.ToString());
}

//CallBack
private void recv(IAsyncResult res)
{
    IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 8000);
    byte[] received = Client.EndReceive(res, ref RemoteIpEndPoint);

    //Process codes

    MessageBox.Show(Encoding.UTF8.GetString(received));
    Client.BeginReceive(new AsyncCallback(recv), null);
}
40

Begin/Endメソッドの代わりにTAPを使用する新しいメソッドでは、.Net 4.5で次を使用できます。

とても簡単です!

非同期メソッド

    private static void UDPListener()
    {
        Task.Run(async () =>
        {
            using (var udpClient = new UdpClient(11000))
            {
                string loggingEvent = "";
                while (true)
                {
                    //IPEndPoint object will allow us to read datagrams sent from any source.
                    var receivedResults = await udpClient.ReceiveAsync();
                    loggingEvent += Encoding.ASCII.GetString(receivedResults.Buffer);
                }
            }
        });
    }

同期方式

上記のasynchronousメソッドに当てはまるように、これはsynchronousメソッドでも非常によく似た方法で実装できます。

    private static void UDPListener()
    {
        Task.Run(() =>
        {
            using (var udpClient = new UdpClient(11000))
            {
                string loggingEvent = "";
                while (true)
                {
                    //IPEndPoint object will allow us to read datagrams sent from any source.
                    var remoteEndPoint = new IPEndPoint(IPAddress.Any, 0);
                    var receivedResults = udpClient.Receive(ref remoteEndPoint);
                    loggingEvent += Encoding.ASCII.GetString(receivedResults);
                }
            }
        });
    }
17
Mehrad

このソリューションに関する2つのリンクをお勧めしますが、これらは私にとって役立ちました。

PC関連

スタックオーバーフロー

最初の方法は本当に簡単な解決策ですが、UDPパケットが最初に「リモート」デバイスに送信された場合にのみ連続受信が機能するため、変更には注意してください。継続的なリスニングを行うには、「udp.BeginReceive(new AsyncCallback(UDP_IncomingData)、udp_ep);」というコード行を追加します着信データを読み取るたびに、UDPパケットの新しい受信を有効にします。

2番目の方法は、マルチキャストIPアドレス(239.255.255.255-240.0.0.0)を使用するためのNiceソリューションです

0
RaKa