1:在提交WSASend或者WSARecv的時候PPER_IO_OPERATION_DATA這個buff為何要用GlobalAlloc 是否可以用new申請?區別何在?
2:當客戶端有1萬左右時,服務器給所有服務端發送訊息,是否可以直接用WSASend投遞一萬次,如果WSASend失敗且GetLastError()!=WSA_IO_PENDING是否需要釋放在[1]中申請的buff并關閉客戶端的socket?經測驗直接投遞一萬次到達客戶端的效率并不高,只有一半以下的客戶能收到資料,而且之后的投遞效率越來越低,最終貌似會導致GetQueuedCompletionStatus都不能獲取到WSASend之后的完成狀態?獲取不到WSASend的完成狀態又會導致申請的buff不能正確釋放從而導致記憶體泄露,這樣的大規模投遞WSASend正確處理方式?
3:因為作業執行緒數量時cpu核數*2,在作業執行緒中會呼叫到回呼函式處理客戶的資料,比如客戶退出,我需要洗掉這個客戶那么必須要在客戶串列中遍歷找到退出的客戶再將其洗掉,當連接數上萬的時候遍歷勢必會阻塞作業執行緒,所以我在作業執行緒中將要退出的socket加入到一個串列中再另開一個執行緒處理這個串列,但由于與此同時是會有客戶端進入和退出的,所以為了避免資料沖突加入了臨界保護變數,但是作業執行緒有客戶進入的時候同樣會進入臨界保護變數,相當于作業執行緒依然要等待處理客戶退出執行緒退出臨界區才能正常運行,相當于還是阻塞了?此處的正確處理方式?
4:我在CSDN提問區提問C幣扣了50,但是問題沒提上去為何?問題需要審核?
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/53496.html
標籤:網絡及通訊開發
