C#UDP监听器解除阻塞?或防止再次被卡住

时间:2011-05-09 03:29:21

标签: c# udp

我一直在寻找像我这样的先前问题,但似乎我找不到我需要的答案。

我的目标是阻止我的UDP侦听器不挂起。我有一个UDP监听器,它等待消息,但如果没有任何东西可以接收它,就会挂起来。

我已阅读其他帖子并且他们说我需要将阻止设置为false ,但我找不到如何设置它。对不起,我刚接触C#和socket编程。

这是我的听众的一部分:

while (true)
{
    try
    {
        byte[] data = listener.Receive(ref groupEP);

        IPEndPoint newuser = new IPEndPoint(groupEP.Address, groupEP.Port);
        string sData =  (System.Text.Encoding.ASCII.GetString(data));

    }
    catch (Exception e)
    {
    }
}

我的问题是它只是冻结在以下一行:

byte[] data = listener.Receive(ref groupEP);

4 个答案:

答案 0 :(得分:7)

使用UDPClient上的available属性(如果这是您正在使用的属性)来确定您是否有要读取的网络队列中的数据。

while (true)
{
    try
    {
        if (listener.Available > 0) // Only read if we have some data 
        {                           // queued in the network buffer. 
            byte[] data = listener.Receive(ref groupEP);

            IPEndPoint newuser = new IPEndPoint(groupEP.Address, groupEP.Port);
            string sData =  (System.Text.Encoding.ASCII.GetString(data));
        }
    }
    catch (Exception e)
    {
    }
}

答案 1 :(得分:0)

        UdpClient client = new UdpClient();
        //Some code goes here ...
        client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 2000);

//这很清楚也很简单。

答案 2 :(得分:0)

您正在使用接收/发送的阻止版本。考虑改用异步版本(ReceiveAsync / BeginReceive)。

https://docs.microsoft.com/en-us/dotnet/api/system.net.sockets.udpclient?view=netcore-3.1

答案 3 :(得分:0)

TestHost.Client.Blocking = false;

您需要访问 UdpClient 对象(下面详细示例中的“TestHost”)下方的“Socket”对象,以访问“Blocking”属性,如下所示:

int Port = 9020;    //Any port number you like will do
IPAddress ActiveIPaddress = new IPAddress(new byte[] { 192, 168, 3, 10 }); //Any IPaddress you need will do
IPEndPoint HostEP = new IPEndPoint(ActiveIPaddress, Port);
UdpClient TestHost = new UdpClient(Global.HostEP);
TestHost.Client.Blocking = false;

enter image description here