国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > .NET > 正文

高效的.Net UDP異步編程實現分析

2024-07-10 12:41:16
字體:
來源:轉載
供稿:網友
因為要寫一個網絡程序要用到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
{
}
}

代碼是不是很簡單?功能是不是很強大?
發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 芜湖市| 黄陵县| 广水市| 营山县| 随州市| 九龙坡区| 南城县| 泊头市| 白朗县| 晴隆县| 尼勒克县| 沧源| 普格县| 潜山县| 阿拉尔市| 汨罗市| 金寨县| 道孚县| 三江| 喀喇沁旗| 思茅市| 台东县| 天祝| 贺兰县| 鄂伦春自治旗| 右玉县| 图们市| 长寿区| 象山县| 赤壁市| 白玉县| 桦南县| 满洲里市| 易门县| 东丰县| 藁城市| 沙河市| 泽普县| 浏阳市| 汾阳市| 洱源县|