濮阳杆衣贸易有限公司

主頁(yè) > 知識(shí)庫(kù) > 高效的.Net UDP異步編程實(shí)現(xiàn)分析

高效的.Net UDP異步編程實(shí)現(xiàn)分析

熱門(mén)標(biāo)簽:保山電話外呼管理系統(tǒng)怎么用 使用智能電話機(jī)器人違法嗎 朝陽(yáng)市地圖標(biāo)注 東莞語(yǔ)音電銷(xiāo)機(jī)器人排名 電話機(jī)器人廣告話術(shù) 外呼系統(tǒng)用員工身份證 淘寶地圖標(biāo)注如何做 太原外呼電銷(xiāo)機(jī)器人費(fèi)用 蘇州銷(xiāo)售外呼系統(tǒng)預(yù)算
因?yàn)橐獙?xiě)一個(gè)網(wǎng)絡(luò)程序要用到UDP協(xié)議,UDP這東西比較麻煩,又不像TCP一樣提供可靠的連接,發(fā)送接收的超時(shí)實(shí)在不好設(shè)計(jì),最后只要用Timer來(lái)檢測(cè)有沒(méi)有想要的數(shù)據(jù)包-_#,不過(guò)這不是這次的重點(diǎn),重點(diǎn)是怎么建立一種高效的UDP機(jī)制來(lái)實(shí)時(shí)接收服務(wù)器發(fā)送過(guò)來(lái)的數(shù)據(jù)包.

CodeProject上有個(gè)例子是開(kāi)個(gè)線程去同步接收,這樣倒是可以滿足我的程序需求,不過(guò)實(shí)際中遇到幾個(gè)問(wèn)題:
1.程序開(kāi)銷(xiāo)大,內(nèi)存狂飆,接一次數(shù)據(jù)就要重新開(kāi)一次線程
2.由于主界面和底層是完全隔離只是通過(guò)中間的接口來(lái)通訊,導(dǎo)致線程總是不能正常的結(jié)束,程序結(jié)束后還有一個(gè)進(jìn)程在那里不知道干什么.
于是翻閱MSDN,查找自己以前寫(xiě)的代碼,最后還是決定用異步來(lái)接收,MSDN上UDP異步的例子不太好,有點(diǎn)敷衍的意思,用異步很好的解決了以上的問(wèn)題,高效完成效率,代碼如下:
復(fù)制代碼 代碼如下:

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);
這里用一個(gè)GetRecvBuffer的回掉來(lái)實(shí)現(xiàn)異步
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數(shù)據(jù)包
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
{
}
}

代碼是不是很簡(jiǎn)單?功能是不是很強(qiáng)大?
您可能感興趣的文章:
  • 深入分析C#異步編程詳解
  • .NET中的異步編程-EAP/APM使用方法及案例介紹
  • .net4.5使用async和await異步編程實(shí)例

標(biāo)簽:呼倫貝爾 洛陽(yáng) 潛江 克拉瑪依 綏化 運(yùn)城 西藏 阿里

巨人網(wǎng)絡(luò)通訊聲明:本文標(biāo)題《高效的.Net UDP異步編程實(shí)現(xiàn)分析》,本文關(guān)鍵詞  高效,的,.Net,UDP,異步,編程,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問(wèn)題,煩請(qǐng)?zhí)峁┫嚓P(guān)信息告之我們,我們將及時(shí)溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無(wú)關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《高效的.Net UDP異步編程實(shí)現(xiàn)分析》相關(guān)的同類(lèi)信息!
  • 本頁(yè)收集關(guān)于高效的.Net UDP異步編程實(shí)現(xiàn)分析的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    沐川县| 屯留县| 白山市| 沐川县| 杭锦后旗| 西昌市| 淳安县| 西和县| 买车| 宁化县| 齐齐哈尔市| 罗平县| 襄汾县| 张掖市| 赤壁市| 天柱县| 塔河县| 缙云县| 衡南县| 松滋市| 蒙山县| 马尔康县| 北宁市| 彰化市| 安岳县| 鸡西市| 交口县| 南宫市| 固始县| 宕昌县| 万源市| 文水县| 嵩明县| 永登县| 阿坝县| 宁国市| 土默特左旗| 新郑市| 临泽县| 仪征市| 始兴县|