/// <summary> /// 接收回调函数 /// </summary> /// <param name="i_IAsyncResult"></param> private void m_ReceiveCallback(IAsyncResult i_IAsyncResult) { //转换 Class_UdpState n_UdpState_Receive = i_IAsyncResult.AsyncState as Class_UdpState; //定义IPEndPoint变量 IPEndPoint n_IPEndPoint = m_IPEndPoint_Local; //如果完成 if (i_IAsyncResult.IsCompleted) { byte[] n_btReceive = n_UdpState_Receive.p_UdpClient_Receive.EndReceive(i_IAsyncResult, ref n_IPEndPoint); //m_UdpState_Receive.p_IPEndPoint //// //Thread.Sleep(5000); n_UdpState_Receive.p_IPEndPoint_Local = n_IPEndPoint; string n_sReceive = string.Empty;// Encoding.Default.GetString(n_btReceive); for (int i = 0; i < n_btReceive.Length; i++) { n_sReceive = n_sReceive + n_btReceive[i].ToString("X2"); } Console.WriteLine("Received: {0}", n_sReceive); //事件状态终止 m_ManualResetEvent_ReceiveDone.Set(); //执行发送 m_SendMessage(n_UdpState_Receive.p_IPEndPoint_Local); } }
/// <summary> /// 发送回调函数 /// </summary> /// <param name="i_IAsyncResult"></param> private void m_SendCallback(IAsyncResult i_IAsyncResult) { Class_UdpState m_UdpState_Send = i_IAsyncResult.AsyncState as Class_UdpState; Console.WriteLine("第{0}个请求处理完毕!", m_UdpState_Send.p_iCounter); Console.WriteLine("number of bytes sent: {0}", m_UdpState_Send.p_UdpClient_Receive.EndSend(i_IAsyncResult)); Console.WriteLine("执行效率: " + ((m_UdpState_Send.p_iCounter) / (m_Stopwatch.ElapsedMilliseconds / 1000.0f)).ToString("F2") + "个/秒"); //(单位:秒) m_ManualResetEvent_SendDone.Set(); }
/// <summary> /// 主调用函数 /// </summary> public void p_ReceiveMessage() { Start: //实例化udpSendState m_UdpState_Receive = new Class_UdpState(); // m_UdpState_Receive.p_UdpClient_Receive = m_UdpClient_Receive; //// //m_UdpState_Receive.p_UdpClient_Receive.Ttl = 100; // m_UdpState_Receive.p_IPEndPoint_Local = m_IPEndPoint_Local; // Console.WriteLine("listening for messages"); //进入循环 while (true) { lock (this) { try { ////时钟停止计时 //m_Stopwatch.Stop(); //日志加载 //Console.WriteLine("总执行时间为: " + (m_Stopwatch.ElapsedMilliseconds / 1000.0f).ToString("F3") + "秒"); //(单位:秒) //定义ManualResetEvent 类的实例 必须有该代码 否则循环会无限制执行 造成CPU占用率过高 m_ManualResetEvent_ReceiveDone = new ManualResetEvent(false); //调用接收回调函数 IAsyncResult n_IAsyncResult = m_UdpClient_Receive.BeginReceive(new AsyncCallback(m_ReceiveCallback), m_UdpState_Receive); //阻止 bool n_bFlag = m_ManualResetEvent_ReceiveDone.WaitOne(); //延时 Thread.Sleep(1); //回收 GC.Collect(); } catch { goto Start; } } } }
/// <summary> /// 构造函数 /// </summary> public Class_AsyncUdpSever() { // 本机节点 m_IPEndPoint_Local = new IPEndPoint(IPAddress.Any, m_iPort_Listen); // 远程节点 m_IPEndPoint_Remote = new IPEndPoint(IPAddress.Parse("192.168.1.221"), m_iPort_Remote);//Dns.GetHostAddresses(Dns.GetHostName())[0] // 实例化 m_UdpClient_Receive = new UdpClient(m_IPEndPoint_Local); m_UdpClient_Send = new UdpClient(); //实例化udpSendState m_UdpState_Receive = new Class_UdpState(); m_UdpState_Receive.p_UdpClient_Receive = m_UdpClient_Receive; m_UdpState_Receive.p_IPEndPoint_Local = m_IPEndPoint_Local; //实例化udpReceiveState m_UdpState_Send = new Class_UdpState(); m_UdpState_Send.p_UdpClient_Receive = m_UdpClient_Send; m_UdpState_Send.p_IPEndPoint_Local = m_IPEndPoint_Remote; //时钟计时开始 m_Stopwatch.Start(); }