我有一个程序,通过UDP将数据从一台计算机发送到另一台计算机。问题是数据可能并不总是由发送程序发送,并且我希望仅在将某些内容发送到指定端口时才启用接收程序的接收功能(在这种情况下为5000),否则当用户尝试接收数据时使用UdpClient
在端口上程序崩溃。例如:
private const int listenPort = 5000;//receiving port
UdpClient listener = new UdpClient(listenPort);//udclient instance
IPEndPoint groupEP = new IPEndPoint(IPAddress.Any, listenPort);
public string received_data;
public byte[] receive_byte_array;
private void receiveButton_Click(object sender, RoutedEventArgs e)
{
receive_byte_array = listener.Receive(ref groupEP);
received_data = Encoding.ASCII.GetString(receive_byte_array, 0, receive_byte_array.Length);
textBox1.Text = received_data.ToString();
}
我的问题是,当没有数据发送且用户点击主窗口上的receiveButton
时,我的整个程序崩溃了。具体问题在于:
receive_byte_array = listener.Receive(ref groupEP);
我试图通过将上面的代码行放在try catch语句中来解决问题,但即使这样,程序也会崩溃!它似乎只是试图在没有引起地狱的情况下在IPEndpoint端口上接收数据。
关于如何首先检查数据是否被发送到端口并且只允许用户接收数据的任何想法?提前谢谢。
答案 0 :(得分:3)
基于你的评论我会说程序正在冻结,因为它正在等待接收数据。您的用户界面冻结,因为您已经开始从UI线程同步监听数据,现在它专注于监听数据而不是重新绘制或处理输入。修复此问题将监听位置于单独的线程中或使用异步BeginReceive方法接收数据。