.Net高效UDP异步编程

 因为要写一个网络程序要用到UDP协议,UDP这东西比较麻烦,又不像TCP一样提供可靠的连接,发送接收的超时实在不好设计,最后只要用Timer来检测有没有想要的数据包 - _#,不过这不是这次的重点,重点是怎么建立一种高效的UDP机制来实时接收服务器发送过来的数据包.
     CodeProject上有个例子是开个线程去同步接收,这样倒是可以满足我的程序需求,不过实际中遇到几个问题:

     
1 .程序开销大,内存狂飙,接一次数据就要重新开一次线程

     
2 .由于主界面和底层是完全隔离只是通过中间的接口来通讯,导致线程总是不能正常的结束,程序结束后还有一个进程在那里不知道干什么.

     于是翻阅MSDN,查找自己以前写的代码,最后还是决定用异步来接收,MSDN上UDP异步的例子不太好,有点敷衍的意思,用异步很好的解决了以上的问题,高效完成效率,代码如下: 
  1. UdpClient qq_client;    //Udp客户端
  2. qq_client = new UdpClient();
  3. IPEndPoint remoteQQEP = new IPEndPoint(remotehost, remoteport);
  4. qq_client.Connect(remoteQQEP);
  5. AsyncCallback GetRecvBuffer = new AsyncCallback(ReceiveCallback);
  6. qq_client.BeginReceive(GetRecvBuffer, null);   
  7. 这里用一个GetRecvBuffer的回掉来实现异步
  8.         private void ReceiveCallback(IAsyncResult ar)
  9.         {
  10.             try
  11.             {
  12.                 lock (this)
  13.                 {
  14.                     byte[] recvbytes = qq_client.EndReceive(ar, ref remoteQQEP);
  15.                     //QQFunction.DebugDump(recvbytes);
  16.                     if (recvbytes[0] != QQDef.QQ_IM_HEAD && recvbytes[0] != 0x03)
  17.                     {
  18.                         //非QQ数据包
  19.                         return;
  20.                     }
  21.                     switch (Pop16(recvbytes, 3))
  22.                     {
  23.                         case QQDef.QQ_REQUEST_TOKEN:
  24.                             DoGetToken(recvbytes);
  25.                             break;
  26.                         case QQDef.QQ_REQUEST_LOGIN:
  27.                             DoGetLogin(recvbytes);
  28.                             break;
  29.                         case QQDef.QQ_GET_ONLINE_FRIEND:
  30.                             DoGetOnline(recvbytes);
  31.                             break;
  32.                         case QQDef.QQ_KEEP_ALIVE:
  33.                             CheckAlive(recvbytes);
  34.                             break;
  35.                         case QQDef.QQ_SEND_IM_MSG:
  36.                             // Do SomeThing
  37.                             break;
  38.                         case QQDef.QQ_RECV_IM_MSG:
  39.                             DoRecvMsg(recvbytes);
  40.                             break;
  41.                         default:
  42.                             QQFunction.DebugDump("UnKnow Command");
  43.                             QQFunction.DebugDump(recvbytes);
  44.                             break;
  45.                     }
  46.                     
  47.                 }
  48.                 lock (this)
  49.                 {
  50.                     AsyncCallback GetRecvBuffer = new AsyncCallback(ReceiveCallback);
  51.                     qq_client.BeginReceive(GetRecvBuffer, null);
  52.                 }
  53.             }
  54.             catch
  55.             {
  56.             }
  57.         }

 

代码是不是很简单?功能是不是很强大?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值