使用MFC的Windows 套接字應注意的幾個問題 (轉)
使用MFC的Windows 套接字應注意的幾個問題 (轉)[@more@]本文主要針對MFC庫中的CAsyncSocket類和CSocket類,才疏學淺,權當做拋磚引玉。
這裡所列出的問題主要是在最近編寫基於IP網的語音的過程中碰到的,不一定很
具代表性,僅供參考和討論。對於從事平臺的開發工作的朋友們,或許會有點利
用價值。
1. CSocket類和CAsyncSocket類對多執行緒的支援問題
Winsocks本身是支援多執行緒的,具有一定的執行緒獨立性和性,但CSocket類以及CAsyn
cSocket類都有一些執行緒安全性問題。比如線上程之間傳遞CSocket就會發生異常,MS
DN中的建議是,傳遞前Detach,傳遞socket控制程式碼,在目標執行緒中再Attach到一個CSocket對
象上。這似乎說明CSocket(或CAsyncSocket)具有執行緒依賴性。
然而情況並不是絕對的,我的程式中出現的兩種傳遞CAsyncSocket或CSocket物件的情況沒
有發生異常,也沒有執行的問題:
(1) 在主執行緒中建立和關閉一個CSocket阻塞型資料包套接字,在另一執行緒中用它傳送資料
(SendTo)。若用它接收資料(ReceiveFrom)則出現異常。
(2) 在主執行緒中建立和關閉一個CAsyncSocket非阻塞型資料包套接字,在另一執行緒中用它
接收資料(ReceiveFrom)也沒有問題了。
上述兩種情況,我的感覺是毫無道理可言,但在我的機器上執行卻是非常穩定。我的建議
是,如果使用CAsyncSocket類和CSocket類,儘量不要跨執行緒使用(我以後也不會鋌而走險
了)。
2. 阻塞和非阻塞的選擇問題
阻塞套接字使用方便,但會影響到執行緒的訊息響應,比較適合於用流式套接字傳送大量數
據的情況。
對於實時語音資料的傳送來說,資料的傳送受制於採集裝置,一旦有資料可傳送,才
套接字來傳送,因而套接字的阻塞與否對執行緒的執行時間佔用不會太大(我的程式中
一個資料包的大小隻有20KB,傳送的過程很快)。而在接收方,音訊回放裝置受制於接收
套接字。在沒有接受到任何資料時,整個執行緒卻卡在ReceiveForm()上,無法實現正常的消
息迴圈,如此時向該執行緒發出WM_QUIT訊息,它將無法得到。同樣,在傳送方,為了不
阻塞傳送執行緒的訊息迴圈,音訊採集裝置也應該是非阻塞(非同步)的。
當然,如果不將音訊回放和資料接收放在同一執行緒中,則也可以用阻塞型套接字,但是這
又帶來另一個問題:兩個執行緒間要共享資料,於是又要涉及到執行緒間同步或互斥的問題,
同時增加了開銷。
3、將套接字事件對映到視窗訊息上時應注意:
當用WSAAsync將套接字事件對映到視窗訊息上時,應注意視窗的訊息阻塞可能會造
成套接字錯誤,如公用對話方塊。特別是在用PreTranslateMessage時極可能出問題。
4、再說兩句廢話。MFC支援 Sockets1但不支援Windows Sockets2。因而一些優良
的將不能使用,如服務質量(QoS)、有根多播。而在某些功能,如IP網多播的使用上
,Windows Sockets1和Windows Sockets2是有一些區別的。
這裡所列出的問題主要是在最近編寫基於IP網的語音的過程中碰到的,不一定很
具代表性,僅供參考和討論。對於從事平臺的開發工作的朋友們,或許會有點利
用價值。
1. CSocket類和CAsyncSocket類對多執行緒的支援問題
Winsocks本身是支援多執行緒的,具有一定的執行緒獨立性和性,但CSocket類以及CAsyn
cSocket類都有一些執行緒安全性問題。比如線上程之間傳遞CSocket就會發生異常,MS
DN中的建議是,傳遞前Detach,傳遞socket控制程式碼,在目標執行緒中再Attach到一個CSocket對
象上。這似乎說明CSocket(或CAsyncSocket)具有執行緒依賴性。
然而情況並不是絕對的,我的程式中出現的兩種傳遞CAsyncSocket或CSocket物件的情況沒
有發生異常,也沒有執行的問題:
(1) 在主執行緒中建立和關閉一個CSocket阻塞型資料包套接字,在另一執行緒中用它傳送資料
(SendTo)。若用它接收資料(ReceiveFrom)則出現異常。
(2) 在主執行緒中建立和關閉一個CAsyncSocket非阻塞型資料包套接字,在另一執行緒中用它
接收資料(ReceiveFrom)也沒有問題了。
上述兩種情況,我的感覺是毫無道理可言,但在我的機器上執行卻是非常穩定。我的建議
是,如果使用CAsyncSocket類和CSocket類,儘量不要跨執行緒使用(我以後也不會鋌而走險
了)。
2. 阻塞和非阻塞的選擇問題
阻塞套接字使用方便,但會影響到執行緒的訊息響應,比較適合於用流式套接字傳送大量數
據的情況。
對於實時語音資料的傳送來說,資料的傳送受制於採集裝置,一旦有資料可傳送,才
套接字來傳送,因而套接字的阻塞與否對執行緒的執行時間佔用不會太大(我的程式中
一個資料包的大小隻有20KB,傳送的過程很快)。而在接收方,音訊回放裝置受制於接收
套接字。在沒有接受到任何資料時,整個執行緒卻卡在ReceiveForm()上,無法實現正常的消
息迴圈,如此時向該執行緒發出WM_QUIT訊息,它將無法得到。同樣,在傳送方,為了不
阻塞傳送執行緒的訊息迴圈,音訊採集裝置也應該是非阻塞(非同步)的。
當然,如果不將音訊回放和資料接收放在同一執行緒中,則也可以用阻塞型套接字,但是這
又帶來另一個問題:兩個執行緒間要共享資料,於是又要涉及到執行緒間同步或互斥的問題,
同時增加了開銷。
3、將套接字事件對映到視窗訊息上時應注意:
當用WSAAsync將套接字事件對映到視窗訊息上時,應注意視窗的訊息阻塞可能會造
成套接字錯誤,如公用對話方塊。特別是在用PreTranslateMessage時極可能出問題。
4、再說兩句廢話。MFC支援 Sockets1但不支援Windows Sockets2。因而一些優良
的將不能使用,如服務質量(QoS)、有根多播。而在某些功能,如IP網多播的使用上
,Windows Sockets1和Windows Sockets2是有一些區別的。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/10752019/viewspace-958122/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- 購買硬碟應該注意的幾個問題硬碟
- 使用Visual Basic訪問資料庫幾個注意的問題 (轉)資料庫
- 安裝UNIX軟體需注意的幾個問題(轉)
- 使用React 應當注意的幾個地方React
- itm UA編寫注意的幾個問題
- Promise使用時應注意的問題Promise
- 開發網校原始碼時應該注意的幾個問題原始碼
- Python import 時要注意的幾個問題PythonImport
- IBM面試需要注意的幾個問題IBM面試
- 面試官:集合使用時應該注意哪些問題?我:應該注意該注意的問題!面試
- 使用electron-builder打包windows應用時的幾個靜態資源問題UIWindows
- Java Thread應該注意的問題 (轉)Javathread
- MFC軟體國際化的幾個問題及其解決方案
- Typora 使用中的幾個問題
- 做好總監工作應抓好的幾個重點問題(轉)
- 做聚合支付代理需要注意的這幾個問題?
- 11gRAC安裝需要注意的幾個問題
- 資料補丁中需要注意的幾個問題
- iOS程式設計師面試要注意的幾個問題~iOS程式設計師面試
- mfc ocx 控制元件開發需要注意的問題控制元件
- Windows下使用TensorBoard顯示幾個注意點WindowsORB
- Redux的應該注意的問題Redux
- 國際工程專案風險管理應研究的幾個問題(轉)
- 軟交換組網應注意的問題與分析(轉)
- C++關於DLL中建立套接字的問題(求教)C++
- 應用SqlitePCL應該注意的問題SQLite
- Linux下使用mozilla的幾個問題Linux
- 做SAP開發的必看的幾個問題(轉)
- Web應用開發中的幾個問題Web
- 使用外連線時應注意重複的問題
- 學習--原始套接字(轉)
- 嵌入式程式設計師應知道的幾個基本問題(轉)程式設計師
- 關於Kerberos安裝的幾個問題(轉)ROS
- MFC開發常見問題的回答2 (轉)
- MFC開發常見問題的回答3 (轉)
- 網路爬蟲設計中需要注意的幾個問題爬蟲
- Masm中呼叫ZwOpenSection時應該注意的問題 (1千字)ASM
- 解決中文問題的幾個常用的函式 (轉)函式