UDP通信的问题
 1 PC与设备通信时,命令多数是一对一的方式,即一问一答
 2 有个别命令是,2对1方式,即,开始命令, 设备一直回数据包,在收到停止时,才停止回数据包 现在的框架基本如下
  if (btnList.Text == "结束")
                {
                    btnList.Text = "开始";
                    btnList.Enabled = true;
// 一对一,停止接收线程前,先发送一个停止命令
         udpBuffer = ul.udpSendCommands(txtConnReaderIPAddress.Text, Convert.ToInt16(txtConnReaderPort.Text), cl.stopSingal(), cl.stopSingal().Length);
                        if (udpBuffer[0] == 0xf0)
                        {
                            udpReceive(udpBuffer);
                        }
                    startServer.Abort();  // 停止接收线程
                          
                }
                else
                {
// 这个地方时,一对一的方式
                        udpBuffer = ul.udpSendCommands(txtConnReaderIPAddress.Text, Convert.ToInt16(txtConnReaderPort.Text), cl.cmdsSelectAnnts(antennas), cl.cmdsSelectAnnts(antennas).Length);
                        if (udpBuffer[0] == 0xf0)
                        {
                            udpReceive(udpBuffer);
                        }
                        else
                        {                            
                            MessageBox.Show("网络异常!");
                            return;
                        }
// 这里发送一个命令,让设备一直回数据包
                        ul.udpSendCommands2(txtConnReaderIPAddress.Text, Convert.ToInt16(txtConnReaderPort.Text), commandsSingel(), commandsSingel().Length);
                        btnListTags.Text = "结束";
                        try
                        {
                            startServer = new Thread(new ThreadStart(startUdpServer));                            startServer.Start();
                           
                        }
                        catch (ThreadAbortException)
                        {
                            MessageBox.Show("error");
                        } 
                    }现在问题是:
 第一次,走下来是可以的,,,线程能接受到数据
 
 当停止后
 第二次,开始时,,就死在了 UDP接收的地方了
 咋回事呢?

解决方案 »

  1.   

    再次运行时 一对一的地方,在接收里报错 异常如下
     AddressFamily = 由于代码已经过优化或者本机框架位于调用堆栈之上,无法计算表达
      

  2.   

    “在接收里报错”那么,接收的代码呢?贴出来的都是发送的(udpSendCommands())
      

  3.   

     public byte[] UdpReceiveData(string readerIP, int readerPort)
            {
               
                    udpIpadr = new IPEndPoint(IPAddress.Parse(readerIP), readerPort);
                    return udp.Receive(ref udpIpadr);
                } 接受代码,就两句话 呵呵
     现在没办法的办法,,全部放到 线程里处理返回 无论是一对一的 模式 还是, 发一次命令,,设备一直回数据 的格式 都放线程里了 无奈 为啥,按原始的意思,就不行呢
      

  4.   

    其实,是想看看在哪里以及如何调用 UdpReceiveData()的,而不是 UdpReceiveData()怎么实现的。“全部放到 线程里处理”就可以了,你可以检查下 子线程是否访问了不属于它的资源。