Posted on 2008-03-12 11:51
小明 閱讀(2913)
評論(7) ?
編輯?
收藏引用 所屬分類:
Win32 、
Network/ACE
Tip 1 : 使用WSASend/WSARecv來收發(fā)數(shù)據(jù),而不是使用ReadFile/WriteFile
一句話,前者具有更好的性能
Tip 2:? 理解IOCP的最大并發(fā)線程數(shù)和工作線程數(shù)
應(yīng)該讓工作線程數(shù)(調(diào)用GetQueuedCompletionStatus那些線程)大于等于在CreateIoCompletionPort 指定的NumberOfConcurrentThreads數(shù)。
標準做法是永遠設(shè)置NumberOfConcurrentThreads=0
Tip 3: 利用GetQueuedCompletionStatus的completion key和overlapped structure參數(shù)在異步操作中來傳遞信息
通常completion key用來傳遞和handle/socket/session的信息
而overlapped structure用來傳遞每次異步I/O的一些信息,通常的做法是會定義一個structure來派生于OVERLAPPED
struct MY_IO_DATA : public OVERLAPPED
Tip 4: 理解IOCP的完成包的排隊行為
從GetQueuedCompletionStatus得到完成包的次序可能跟調(diào)用WSASend/WSARecv的次序不一樣。
微軟唯一保證是如果調(diào)用WSASend/WSARecv得到SUCCESS或者IO_PENDING,就一定會有一個完成包出現(xiàn)在IOCP的隊列上,不管這個socket是否關(guān)閉了。
如果關(guān)閉socket,那么之后的WSASend/WSARecv調(diào)用就一定返回失敗的結(jié)果。
關(guān)于IOCP包可能次序錯亂和解決方法,有一篇文章可以參考: http://www.codeproject.com/KB/IP/reusablesocketserver4.aspx
我的做法是避免多次調(diào)用WSARecv
Tip 5: IOCP的清除
最重要的一點是,在I/O完成之前,不要釋放overlapped structure??梢杂肏asOverlappedIoCompleted來監(jiān)測OV是否完成。
通常的做法是
1) 調(diào)用PostQueueCompletionStatus N次(N=工作線程數(shù)),來傳遞特殊的退出信息給所有的工作線程
2) 關(guān)閉所有的socket,如果很在意處理完未完成的數(shù)據(jù)包,需要使用一個計數(shù)器來跟蹤異步I/O事件,直到計數(shù)器為0,才關(guān)閉相應(yīng)的socket
3) 關(guān)閉completion port