UDP 接受多个端口数据问题

fh1037723204 2013-04-24 09:54:17
我使用UdpClient.Send(SendData, SendData.Length, DefaultIpEndPoint); 来向指定IP发送数据的,
用IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 0);
Byte[] ReceiveBytes = UdpClient.Receive(ref RemoteIpEndPoint);来监听接受任意IP端口发来的数据,但是好像只能接受我前一次send数据的IP地址返回的数据???这是为什么?请各位解释解释!
...全文
928 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
fh1037723204 2013-05-01
  • 打赏
  • 举报
回复
private void asynclisten() { try { IPEndPoint e = new IPEndPoint(IPAddress.Any, 0); UdpClient u = new UdpClient(e); UdpState s = new UdpState(); s.e = e; s.u = u; iAr = u.BeginReceive(new AsyncCallback(RecvCallback), s); label3.Text = "准备接受数据!"; while (!messageReceived) { Thread.Sleep(1000); } } catch (Exception e) { MessageBox.Show(e.Message); } } //返回调用 private void RecvCallback(IAsyncResult ar) { try { UdpClient u = (UdpClient)((UdpState)(ar.AsyncState)).u; IPEndPoint e = (IPEndPoint)((UdpState)(ar.AsyncState)).e; Byte[] receiveBytes = u.EndReceive(ar, ref e); iAr = u.BeginReceive(new AsyncCallback(RecvCallback), (UdpState)(ar.AsyncState)); messageReceived = true; label3.Text = "What a fucking code!"; } catch (Exception e) { MessageBox.Show(e.Message); } } 我用抓包软件看到下位机数据船上来了,但是就是没有调用RecvCallback。
fh1037723204 2013-05-01
  • 打赏
  • 举报
回复
没有while (!messageReceived) { Thread.Sleep(100); } 那BeginReceive执行过后程序跑哪去了?这个是MSDN例程上这么用的。
  • 打赏
  • 举报
回复
CheckForIllegalCrossThreadCalls = false; 这种代码也要删掉。 ThreadRevData = new Thread(new ThreadStart(listen)); 既然随后异步处理,整什么显示的Thread啊?画蛇添足毫无意义。 ..................
  • 打赏
  • 举报
回复
while (!messageReceived) { Thread.Sleep(100); } 这叫啥代码啊? 既然是异步的程序,就没有什么循环或者阻塞。 删除掉。
fh1037723204 2013-05-01
  • 打赏
  • 举报
回复
我发现程序死在while (!messageReceived) { Thread.Sleep(100); } 处,及时我在此时给它发送数据,用抓包软件看数据上传来了,但是还是没有异步接收到。程序一直死在这个循环处。求解释!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
三五月儿 2013-04-28
  • 打赏
  • 举报
回复
单步调试,看看为什么message.box函数没有被执行
fh1037723204 2013-04-28
  • 打赏
  • 举报
回复
目的:上位机开一个异步接收数据线程,用于接受下位机实时上传的数据。同时也可以主动发送数据。 过程:在类构造函数中开一个线程,用于异步接受下位机数据,再设置一个button,click后可以主动发送数据。定时器用于超时重传。 问题:用抓包软件检测显示,上位机数据可以发送出去,下位机相应数据包也可上传,但是程序好像没有进入异步接受调用函数ReceiveCallback(因为该函数中用来message.box函数显示一个对话框,程序执行中并没有出现)。 public partial class Form1 : Form { UdpClient UdpClient,u; UdpState s; private static Thread ThreadRevData;//定义一个线程 private static System.Timers.Timer aTimer;//定义一个定时器 static string SetIpString; IPEndPoint SetIpEndPoint=null ,ee=null ; //发送数据用远端IP和端口 static byte[] GSendData; //用于重发的数组 static int TimerSend = 0; private static bool messageReceived = false; private static bool SendOrReturn = false; public Form1() { UdpClient = new UdpClient(); InitializeComponent(); CheckForIllegalCrossThreadCalls = false; Form1_Load(); } private void Form1_Load() //加载异步监听线程 { ThreadRevData = new Thread(new ThreadStart(listen)); ThreadRevData.IsBackground = true; ThreadRevData.Start(); } //监听接收数据 private void listen() { IPEndPoint ee = new IPEndPoint(IPAddress.Any, 99); u = new UdpClient(ee); s = new UdpState(); s.e = ee; s.u = u; u.BeginReceive(new AsyncCallback(ReceiveCallback), s); while (!messageReceived) { Thread.Sleep(100); } } public void ReceiveCallback(IAsyncResult ar) { u = (UdpClient)((UdpState)(ar.AsyncState)).u; IPEndPoint ee = (IPEndPoint)((UdpState)(ar.AsyncState)).e; Byte[] ReceiveBytes = u.EndReceive(ar, ref ee); //数据处理, MessageBox.Show("laiguo"); u.BeginReceive(new AsyncCallback(ReceiveCallback), s); //继续监听 } private void OnTimedEvent(object source, ElapsedEventArgs e) { if (TimerSend > 2) //重传发送次数满3次 { ThreadRevData.Abort();//终止监听线程 aTimer.Stop(); aTimer.Dispose(); TimerSend = 0;//将发送次数置零 MessageBox.Show("通信失败!"); return; } try { if (SendOrReturn == false) //重发主动数据 UdpClient.Send(Form1.GSendData, Form1.GSendData.Length, SetIpEndPoint); else //重发ACK u.Send(Form1.GSendData, Form1.GSendData.Length, ee); TimerSend++; } catch (Exception SendError3) { MessageBox.Show(SendError3.ToString()); } } private void Sendbutton_Click(object sender, EventArgs e) { ThreadRevData.Suspend(); string temp = this.UDPSend.Text; //临时存储发送区数据,以空格隔开 string[] StrArray = temp.Split(' ');//以大字符串中空格分割成子字符串 List<byte> bytes = new List<byte>(); foreach(string i in StrArray) { byte a=Convert.ToByte(i,16); bytes.Add(a); } byte[] SendData = bytes.ToArray(); GSendData = SendData; //保存重发数据 SetIpString = this.IPTextBox1.Text; //读取默认IP地址 IPEndPoint SetIpEndPoint = new IPEndPoint(IPAddress.Parse(SetIpString), 99); UdpClient.Connect(SetIpEndPoint); aTimer = new System.Timers.Timer(1000); aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent); aTimer.AutoReset = true; //设置是执行一次(false)还是一直执行(true); TimerSend = 0; //超时重传次数置0 try { UdpClient.Send(SendData, SendData.Length); SendOrReturn = false; } catch (Exception SendError1) { Console.WriteLine(SendError1.ToString()); } aTimer.Enabled = true;//开始计时 ThreadRevData.Resume(); }
v夜v风v 2013-04-24
  • 打赏
  • 举报
回复
代码能再全点吗?这个样子看不出来的
ariesget 2013-04-24
  • 打赏
  • 举报
回复
自己下个抓包的工具,看下包是不是到了你接收端不就好了。
gomoku 2013-04-24
  • 打赏
  • 举报
回复
是否有可能“任意IP端口发来的数据”被防火墙拦截了? 对你刚刚“向指定IP发送数据”,防火墙一般会建立一个记录(以便,在比如一分钟内,回复能通过防火墙)。 这可能解释你“好像只能接受我前一次send数据的IP地址返回的数据”的现象。

110,536

社区成员

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

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

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