我一直在寻找像我这样的先前问题,但似乎我找不到我需要的答案。
我的目标是阻止我的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);
答案 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;