华域联盟 .Net 高效的.Net UDP异步编程实现分析

高效的.Net UDP异步编程实现分析

因为要写一个网络程序要用到UDP协议,UDP这东西比较麻烦,又不像TCP一样提供可靠的连接,发送接收的超时实在不好设计,最后只要用Timer来检测有没有想要的数据包-_#,不过这不是这次的重点,重点是怎么建立一种高效的UDP机制来实时接收服务器发送过来的数据包.

CodeProject上有个例子是开个线程去同步接收,这样倒是可以满足我的程序需求,不过实际中遇到几个问题:

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

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

于是翻阅MSDN,查找自己以前写的代码,最后还是决定用异步来接收,MSDN上UDP异步的例子不太好,有点敷衍的意思,用异步很好的解决了以上的问题,高效完成效率,代码如下:

复制代码 代码如下:

UdpClient qq_client; //Udp客户端

qq_client = new UdpClient();

IPEndPoint remoteQQEP = new IPEndPoint(remotehost, remoteport);

qq_client.Connect(remoteQQEP);

AsyncCallback GetRecvBuffer = new AsyncCallback(ReceiveCallback);

qq_client.BeginReceive(GetRecvBuffer, null);

这里用一个GetRecvBuffer的回掉来实现异步

private void ReceiveCallback(IAsyncResult ar)

{

try

{

lock (this)

{

byte[] recvbytes = qq_client.EndReceive(ar, ref remoteQQEP);

//QQFunction.DebugDump(recvbytes);

if (recvbytes[0] != QQDef.QQ_IM_HEAD && recvbytes[0] != 0x03)

{

//非QQ数据包

return;

}

switch (Pop16(recvbytes, 3))

{

case QQDef.QQ_REQUEST_TOKEN:

DoGetToken(recvbytes);

break;

case QQDef.QQ_REQUEST_LOGIN:

DoGetLogin(recvbytes);

break;

case QQDef.QQ_GET_ONLINE_FRIEND:

DoGetOnline(recvbytes);

break;

case QQDef.QQ_KEEP_ALIVE:

CheckAlive(recvbytes);

break;

case QQDef.QQ_SEND_IM_MSG:

// Do SomeThing

break;

case QQDef.QQ_RECV_IM_MSG:

DoRecvMsg(recvbytes);

break;

default:

QQFunction.DebugDump("UnKnow Command");

QQFunction.DebugDump(recvbytes);

break;

}

}

lock (this)

{

AsyncCallback GetRecvBuffer = new AsyncCallback(ReceiveCallback);

qq_client.BeginReceive(GetRecvBuffer, null);

}

}

catch

{

}

}

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

您可能感兴趣的文章:

  • 深入分析C#异步编程详解
  • .NET中的异步编程-EAP/APM使用方法及案例介绍
  • .net4.5使用async和await异步编程实例

本文由 华域联盟 原创撰写:华域联盟 » 高效的.Net UDP异步编程实现分析

转载请保留出处和原文链接:https://www.cnhackhy.com/44913.htm

本文来自网络,不代表华域联盟立场,转载请注明出处。

作者: sterben

发表回复

联系我们

联系我们

2551209778

在线咨询: QQ交谈

邮箱: [email protected]

工作时间:周一至周五,9:00-17:30,节假日休息

关注微信
微信扫一扫关注我们

微信扫一扫关注我们

关注微博
返回顶部