2011-05-09 141 views
1

我一直在寻找像我这样的以前的问题,但似乎我找不到我需要的答案。C#UDP监听器解除阻塞?或防止被卡住

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

我已阅读其他线程,他们说我需要设置阻止为假但我找不到如何设置它。对不起,我只是C#和套接字编程的新手。

这里是我的听众的一部分:

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); 
+0

什么类型是监听者? – 2011-05-09 05:12:48

回答

5

使用的UDPClient可用的属性(如果这是你是什么使用)来确定您是否有网络队列中的数据要读取。

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) 
    { 
    } 
} 
+0

嗨杰克!正是我需要的..非常感谢你(n_n)_Y – Katherina 2011-05-09 05:25:15

+1

但是,没有任何循环中断,它不会实际上等于原始代码?在Receive()上阻塞,而不是在循环中连续循环(可用)检查而不是刻录CPU,不是吗? – 2011-06-06 07:42:17

+0

在'try {}'子句中添加一个Thread.Sleep(10);并且CPU烧录完全消失。 – SSpoke 2011-08-31 18:40:24

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

//这是非常简单明了。