新手求助关于UDP异步通信接收的问题

liuyemeixin1 2016-12-20 11:16:20
主要功能是上位机管理设备通信,上位机一台,连接网口转串口设备,类似于交换机性质,设备通过串口连接到交换机,上位机通过网口连接控制,交换机上每个串口都会分配一个IP地址.设备最多可能到100台左右.
同步通信点对点已调试接收好,但考虑到设备数量多,UDP同步接收可能会造成通信阻塞,于是打算采用异步收发.
问题有2,
1.查询设备状态,由上位机进行广播,由于设备限制,设备收到查询信息后就直接反馈当前设备状态到主机,这样主机通信会不会阻塞?
2.异步发送调试通过,但接收始终接收不到数据.代码如下:
 
public frmMain mainForm;
private static Thread ClientRecThread;
bool bReceiving = false;
private UdpClient recvUdpClient=null;
private UdpClient sendUdpClient=null;
IPEndPoint remoteIPE = null;
IPEndPoint localIPE = null;
private ManualResetEvent sendDone = new ManualResetEvent(false);
private ManualResetEvent recvDone = new ManualResetEvent(false);
UdpState udpRecvState = null;
UdpState udpSendState = null;
public UdpClientClass(string strLocalIp, int nLocalPort,string strTargetIp,int nTargetPort,string strNetMask,string strGateWay)
{
localIPE = new IPEndPoint(IPAddress.Any, nLocalPort);
remoteIPE = new IPEndPoint(IPAddress.Parse(strTargetIp), nTargetPort);

recvUdpClient = new UdpClient(localIPE);
sendUdpClient = new UdpClient();

udpRecvState = new UdpState();
udpRecvState.ipEndPoint = localIPE;
udpRecvState.udpclient = recvUdpClient;

udpSendState = new UdpState();
udpSendState.ipEndPoint = remoteIPE;
sendUdpClient.Connect(udpSendState.ipEndPoint);
udpSendState.udpclient = sendUdpClient;
StartLisnProc();
}

private void StartLisnProc()
{
bReceiving = true;
ClientRecThread = new Thread(new ThreadStart(RecvData));
ClientRecThread.IsBackground = true;
ClientRecThread.Start();
}
private void RecvData()
{
while(bReceiving)
{
lock (this)
{
IAsyncResult iar = recvUdpClient.BeginReceive(new AsyncCallback(asycRecvCallback), udpRecvState);
recvDone.WaitOne();
}
}
}
private void asycRecvCallback(IAsyncResult iar)
{
UdpState udpState = iar.AsyncState as UdpState;
if (iar.IsCompleted)
{
byte[] recvBytes = udpState.udpclient.EndReceive(iar, ref udpRecvState.ipEndPoint);
string strRecv = ByteToString(recvBytes);
if (recvBytes.Length > 0)
{
mainForm.UpdateState(strRecv, recvBytes.Length);
}
recvDone.Set();
}
}

IAsyncResult iar = recvUdpClient.BeginReceive(new AsyncCallback(asycRecvCallback), udpRecvState);
程序运行到这里后等待信号,数据到来之后始终跳转不到回调函数里.如果把recvUdpClient换为sendUdpClient就可以跳转到回调函数里,这样就接收不到其他设备的数据.请问大神问题出在什么地方啊?急
...全文
115 2 打赏 收藏 转发到动态 举报
写回复
用AI写文章
2 条回复
切换为时间正序
请发表友善的回复…
发表回复
liuyemeixin1 2016-12-20
  • 打赏
  • 举报
回复
刚刚试了试,如果换成回路地址就可以收到数据了,但接到设备上依然收不到数据。换成回路地址时会提示由于系统缓冲区不足或队列已满,不能执行套接字上的操作,加了thread.sleep就可以了。这个是什么原因?线程休眠以后会不会对数据接收有影响?快来大神给予解答啊
liuyemeixin1 2016-12-20
  • 打赏
  • 举报
回复
有没有人知道啊?没有分哦?这个问题困扰几天了,单就异步通信的步骤来看,应该没什么问题哦。可就是接收不到,发送没问题

110,534

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧