1. 為什么要用 AcceptEx 去多次投遞呢?而且AcceptEx 的引數里面,貌似也沒有和完成埠聯系起來的引數,不造AcceptEx 接受到連接后,完成埠是怎么造的~~
2. 完成埠內部會不會忙不過來,當很多連接、資料過來的時候,完成埠將資料或請求都放在佇列里面,供多個執行緒取,幾個執行緒取,一個執行緒(額,不明白完成埠里面的原理,姑且看成一個執行緒吧)去寫入,忙得過來么?
3. WSARev 的引數也沒有完成埠,我感覺看了網上的代碼后,貌似是完成埠在有請求或者資料到來的時候,WSARecv 就已經接受到了資料,然后完成埠放到佇列里面的,貌似只是一個通知,通知讀取就OK了。。。那完成埠是怎么知道 WSARecv 讀完了呢??
新手小白,誠心求教,不吝賜教時,切勿人身攻擊(人非生而知之者,都是慢慢學的~~)
uj5u.com熱心網友回復:
頂起,求大神~uj5u.com熱心網友回復:
另外我還有一點不太明白,用于從完成佇列里面取出資料(呼叫 GetQueuedCompletionStatus的執行緒 )的執行緒數量最好是CPU數量的兩倍,可是服務器里面,不僅有用于取資料的執行緒,還有用于發送資料的執行緒,還有用于其他操作的執行緒,那這個規定有什么意義呢?就好比,N 個廚師做 2 * N 個菜是最好的,但是總有人將各種事情分配給廚師做(占用廚師CPU的資源),這樣的效率怎么保證呢?難道是所有的執行緒數之和是 CPU 的兩倍??uj5u.com熱心網友回復:
有人在么????
uj5u.com熱心網友回復:

關注一下,沒明白什么意思
uj5u.com熱心網友回復:
好吧,可能問題確實腦殘了點吧。。。uj5u.com熱心網友回復:
《windows網路編程技術》uj5u.com熱心網友回復:
accept是阻塞的,一直要到有客戶端連接后才回傳,而AcceptEx是異步的,呼叫后直接就回傳了,因此AcceptEx有條件完成多次AcceptEx呼叫AcceptEx投遞相當于listen socket一個IO請求,相當于將AcceptEx呼叫要完成的任務委托給完成埠完成,完成埠相當于接受了一個哨兵的任務,任務是在有資料時通知之前創建好的某個接收執行緒完成接收
這樣,你的第一個問題的一部分就解決了,完成埠就是干哨兵搞通知的,至于完成埠怎么和AcceptEx相關的執行緒連接起來,系統內部會維護一個串列,記錄了它們之間的聯系
你的第一個問題中的多次投遞就是解決你第二個問題的,完成埠就一哨兵,不會忙不過來,這正忙的是接收資料的執行緒,假設你完成了AcceptEx的多次投遞,那么當一個執行緒正在忙于處理或接收資料,它也就不會處理新的資料,新的作業就交給你多次AcceptEx的其它執行緒了
第三個問題你應該也大概明白了,就不在贅述了
uj5u.com熱心網友回復:
我這語言組織能力越來越差了,舌頭打轉,這文章也不流利了uj5u.com熱心網友回復:
“執行緒數量最好是CPU數量的兩倍”,這個毫無道里,CPU的強大不是一個內核只處理一個執行緒,CPU的一個核心中處理某型別資料的單元不一定只有一個,一般都是多個甚至十數個,數十個,因此,CPU處理執行緒的能力不一定是一個內核一個很多時候,你的客戶端同時有數十個連接在傳輸資料,你一雙核CPU只開四個執行緒不是很不夠用?反過來講,系統中已經有程式開了幾十個執行緒,你的只開四個對系統也沒有任何幫助吧
作業系統會合理調度你的執行緒的,你的程式中的合理的做法是開始只開兩三個執行緒,當一個被使用時先再開一個,然后執行接收任務,這樣在執行緒數達到上限之前,始終保持剩余一個或兩個空執行緒,并且設定執行緒數量上限,比如10個執行緒,超過了果斷不處理
uj5u.com熱心網友回復:
留下郵箱我給你原始碼,builder寫的10W長連接無壓力,自己去體會吧。uj5u.com熱心網友回復:
兄弟,給個原始碼,[email protected]
uj5u.com熱心網友回復:
hyj_led#163.com 同求,謝謝!
uj5u.com熱心網友回復:
已經發你郵箱了
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/94385.html
標籤:網絡及通訊開發
上一篇:mfc初學者,要做一個基于基于單檔案的程式,視圖分割,左邊是單檔案,右邊是對話框,急求!!求完整詳細步驟,vs2013,一定要詳細的,純小白,剛學幾天要做小專案
