socket 10106問題解決日記_socket

來源:互聯網
上載者:User
       很久沒寫部落格了,這兩天解決了一個建立通訊端(SOCKET)失敗,錯誤碼為10106的問題。從事網路編程的朋友可能也遇到過類似問題,大多數都可以通過重裝系統解決。這次我想分析一下10106產生的根本原因,給大家提供另外一種思路,解決類似問題。
【環境】 WIN7,64位系統
【現象】 CAD2006平台程式不能連網,其他程式沒有問題
【錯誤原因】 建立SOCKET失敗,錯誤碼10106
【嘗試方法】 1. 在A.dll(非CAD程式啟動時載入)的入口函數中測試網路連接,成功。 2. 在B.dll(CAD程式啟動時載入)的入口函數中測試網路連接,失敗。 3. 在B.dll的入口函數中手動載入ws2_32.dll成功,mswsock.dll失敗,錯誤碼127。 4. 卸載使用者電腦上的卡巴斯基,不行。 5. 卸載cad重新安裝,然後使用Registry Mechanic修複註冊表,問題解決。
【原因分析】       使用MemDll載入mswsock.dll發現是修正IAT時失敗了,具體原因是修正WahDestroyHandleContextTable函數地址時失敗, ws2_32.dll模組中找不到這個函數。我們知道,ws2_32.dll的5.1版本確實沒有匯出此函數,此函數在ws2help.dll中匯出; 但是在6.1版本中(win7),ws2_32.dll匯出了該函數。       進一步調試,在B.dll的入口函數中載入ws2_32.dll成功後,根據模組控制代碼擷取模組路徑,發現 CAD2006平台程式中載入的ws2_32.dll模組路徑 在cad2006目錄下,而其他程式則是在system32目錄下。        令人不解的是,在cad2006目錄下根本找不到ws2_32.dll檔案,在整個系統中全域搜尋,也只找到3個ws2_32.dll檔案,都在系統目錄下,並且都是6.1版本。 手工拷貝一個6.1版本的ws2_32.dll檔案到cad2006目錄,問題依舊。於是懷疑是CAD平台程式的運行時環境出了問題(本質上是cad的運行時環境有問題), 比如ws2_32.dll是不是真的載入成功了。擷取到的ws2_32.dll的模組控制代碼是不是錯亂了。是不是根據控制代碼擷取模組所在目錄的API錯亂了等等。         嘗試從已載入的ws2_32.dll模組中擷取accept等5.1版本中的介面,都可以成功,這說明ws2_32.dll確實已經載入,並且有效,只是版本不對,是5.1,而非6.1。 最後將cad卸載掉重新安裝,問題解決。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.