C#UDP侦听器是否取消阻塞?或者防止重新接收被卡住
我一直在寻找以前的问题,比如我的问题,但似乎我找不到我需要的答案 我的目标是防止UDP侦听器不挂起。我有一个UDP侦听器,它在等待消息,但如果没有任何消息可以接收,它就挂在那里 我读过其他线程,他们说我需要将阻塞设置为false,但我找不到如何设置它。抱歉,我刚刚接触C#和socket编程 以下是我的听众部分:C#UDP侦听器是否取消阻塞?或者防止重新接收被卡住,c#,udp,C#,Udp,我一直在寻找以前的问题,比如我的问题,但似乎我找不到我需要的答案 我的目标是防止UDP侦听器不挂起。我有一个UDP侦听器,它在等待消息,但如果没有任何消息可以接收,它就挂在那里 我读过其他线程,他们说我需要将阻塞设置为false,但我找不到如何设置它。抱歉,我刚刚接触C#和socket编程 以下是我的听众部分: while (true) { try { byte[] data = listener.Receive(ref groupEP); IP
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);
使用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)
{
}
}
//这非常清楚和简单。您使用的是接收/发送的阻塞版本。考虑使用异步版本(接收异步/开始接收)。
但是,如果没有任何循环中断,它实际上是否与原始代码相同?最好是在Receive()处阻塞,而不是在循环中使用连续的if(可用)检查来烧掉CPU,不是吗?添加一个
Thread.Sleep(10)
在try{}
子句中,CPU烧录完全消失。。
UdpClient client = new UdpClient();
//Some code goes here ...
client.Client.SetSocketOption(SocketOptionLevel.Socket, SocketOptionName.ReceiveTimeout, 2000);