服务器之家

服务器之家 > 正文

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

时间:2019-10-11 11:03     来源/作者:asp.net教程网

因为要写一个网络程序要用到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 



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

标签:

相关文章

热门资讯

玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分
玄元剑仙肉身有什么用 玄元剑仙肉身境界等级划分 2019-06-21
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情
华为nova5pro和p30pro哪个好 华为nova5pro和华为p30pro对比详情 2019-06-22
男生常说24816是什么意思?女生说13579是什么意思?
男生常说24816是什么意思?女生说13579是什么意思? 2019-09-17
抖音撒撒累累是什么歌 撒撒累累张艺兴歌曲名字
抖音撒撒累累是什么歌 撒撒累累张艺兴歌曲名字 2019-06-05
超A是什么意思 你好a表达的是什么
超A是什么意思 你好a表达的是什么 2019-06-06
返回顶部