26

我一直在寻找通过UdpClient. C#有没有人对此有任何解决方案?

4

3 回答 3

45

试试这个代码:

//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);
}
于 2011-09-14T22:52:45.383 回答
21

对于使用 TAP 而不是 Begin/End 方法的较新方法,您可以在 .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);
                }
            }
        });
    }
于 2014-06-11T04:33:18.283 回答
0

我可以推荐两个有关此解决方案的链接,这对我很有帮助。

电脑相关

堆栈溢出

第一个是非常简单的解决方案,但要小心修改,因为只有当一些 UDP 数据包首先发送到“远程”设备时,持续接收才会起作用。对于持续监听,添加代码行“udp.BeginReceive(new AsyncCallback(UDP_IncomingData), udp_ep);” 在每次读取传入数据后启用新的 UDP 数据包接收。

第二个是使用多播 IP 地址(239.255.255.255 - 240.0.0.0)的好解决方案

于 2015-06-26T12:34:11.700 回答