日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

Simple IOCP Server代码解读

發(fā)布時(shí)間:2023/12/20 编程问答 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Simple IOCP Server代码解读 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

1,如何處理亂序。

按照投遞Read的次序,收到ReadComplete時(shí),看收到的buffer中序號(hào)跟連接中的序號(hào)是否相等。

不如用例子表示:
b1,b2表示兩個(gè)Read請(qǐng)求用的buffer。連接Context中序列號(hào)為0,b1保存的序號(hào)為0,b2保存的序號(hào)為1.
p2,p1表示先收到第二個(gè)Read的反饋,p2對(duì)應(yīng)的buffer為b2,里面的序號(hào)為1,而連接Context中的序號(hào)還是0,所以暫時(shí)不處理,將buffer緩沖起來。
等p1到達(dá),p1對(duì)應(yīng)的buffer為b1,里面的序號(hào)為0,而連接中的序號(hào)是0,處理,再將連接序號(hào)+1,由于處理是在一個(gè)while循環(huán)中,繼續(xù)查找序號(hào)為1的buffer,找到后,處理。
如此這般就能實(shí)現(xiàn)對(duì)buffer的亂序處理。

?

if(m_bReadInOrder)
??????? pOverlapBuff=GetNextReadBuffer(pContext,pOverlapBuff);

??????? while(pOverlapBuff!=NULL)
??????? {
??????????? //TRACE("R> %i\r\n",pOverlapBuff->GetSequenceNumber());

??????????? // Mark that we are Using the buffer..
??????????? pOverlapBuff->Use(dwIoSize);
??????????? ProcessPackage(pContext,dwIoSize,pOverlapBuff);
??????????? IncreaseReadSequenceNumber(pContext);
??????????? pOverlapBuff=NULL;
??????????? if(m_bReadInOrder)
??????????????? pOverlapBuff=GetNextReadBuffer(pContext);
??????? }

}

?

2,如何提升讀取性能。

一個(gè)新的客戶端連上后,先通過ARead()投遞0字節(jié)IOInitialize事件給IOCP端口。

當(dāng)IOCP端口上收到該IOInitialize事件后(自產(chǎn)自銷?),又干了這個(gè):

??? AZeroByteRead(pContext,pOverlapBuff);?????????????????????????? // 投遞(PostQueuedCompletionStatus)一個(gè)0字節(jié)IOZeroByteRead事件。
??? // m_iNumberOfPendlingReads=1 by default.
??? for(int i=0;i<m_iNumberOfPendlingReads;i++)
??? {
??????? EnterIOLoop(pContext); // One for each Read Loop
??????? ARead(pContext);???????????????????????????????????????????????????? // 投遞(PostQueuedCompletionStatus)n個(gè)0字節(jié)IORead事件。
??? }

當(dāng)IOCP端口上收到IOZeroByteRead事件后,會(huì)將buffer類型設(shè)置成IOZeroReadCompleted,觸發(fā)讀取(WSARecv)緩沖區(qū)長度設(shè)為0的包。

當(dāng)IOCP端口上收到IOZeroReadCompleted事件后,會(huì)重新調(diào)用AZeroByteRead(),如此循環(huán)往復(fù)。

?

在IOCP端口上收到IORead事件后,將buffer類型設(shè)置成IOReadCompleted,然后動(dòng)真格的,觸發(fā)讀取(WSARecv)緩沖設(shè)為真正buffer長度。

當(dāng)IOCP端口上收到IOReadCompleted事件后,繼續(xù)調(diào)用ARead(pContext),如此循環(huán)往復(fù),保持m_iNumberOfPendlingReads個(gè)讀請(qǐng)求。

?

1,上面連續(xù)投遞n個(gè),是為了提高吞吐率,當(dāng)正在處理一個(gè)數(shù)據(jù)包時(shí),還可以同時(shí)接收數(shù)據(jù)。

2,沒有直接投遞IOReadCompleted,而是先Post IORead,馬上再WSARecv IOReadCompleted,是為了將大任務(wù)分解成小任務(wù),符合IOCP的特點(diǎn)。

3,循環(huán)投遞IOZeroByteRead,是為了將投遞的IOReadCompleted緩沖區(qū)解鎖。看下面鏈接:

http://topic.csdn.net/u/20100209/10/0271d94f-0785-427b-85f5-51fe7417d22d.html

?

3,如何處理分包。

看ProcessPackage代碼即可。

?

4,如何處理Context非法訪問。

在一個(gè)連接中,你知道要關(guān)閉該連接,并關(guān)閉,但同時(shí)有幾個(gè)IORead請(qǐng)求已經(jīng)發(fā)出,不可避免的,它們馬上返回IOCP消息,但你已經(jīng)不能再訪問消息中的Context對(duì)象了。

解決辦法,給Context增加計(jì)數(shù)器,當(dāng)最后一個(gè)IORead返回(不論成功或失敗)時(shí),計(jì)數(shù)器肯定等于0,這時(shí)才能釋放資源。

但我的疑問是:IOCP請(qǐng)求和IOCP事件是一一對(duì)應(yīng)的嗎?客戶端主動(dòng)關(guān)閉時(shí),會(huì)不會(huì)發(fā)生多余的IOCP事件。看代碼,看TriggerRecv的時(shí)機(jī)對(duì)不對(duì)。

?

5,有害的大包設(shè)計(jì)。

?

6,轉(zhuǎn)發(fā)服務(wù)器只要讀取時(shí)處理亂序、分包,發(fā)送不必關(guān)心。

轉(zhuǎn)載于:https://www.cnblogs.com/tara/archive/2012/04/16/2451868.html

總結(jié)

以上是生活随笔為你收集整理的Simple IOCP Server代码解读的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。