socket 10106問題解決日記

2021-06-18 03:34:29 字數 1227 閱讀 7998

很久沒寫部落格了,這兩天解決了乙個建立套接字(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解除安裝掉重新安裝,問題解決!

問題 解決Android中socket自動斷開連線

遇到的問題 連線上藍芽模組後,能夠正常讀數,藍芽資料傳送速率為0.03s每個。大概在傳送了342個資料之後,突然接收不到資料了。後來查詢了資料,顯示原來android中藍芽socket通訊連線時長大概為120s,如果超過這個時間沒有操作,就會斷開連線。但是我想了一下,客戶端一直在讀取資料流的呀,怎麼...

oom問題解決

dalvik虛擬機會為應用程式分配固定大小的heap 如果使用超過了這個heap的大小,且沒有可被 物件,就會報oom。多張較大會迅速占用空間造成oom。我們可以使用一下的方法來減少這種情況的產生 1.減少單張的大小,根據螢幕大小來對bitmap做resize。private void setima...

too many open files問題解決辦法

今天用 往liunx中寫檔案,檔案很多 執行一會就日誌上就報錯 too many open files 結果找了半天才解決這個問題,現在給大家分享一下。首先用 ulimit a 命令看看linux的open files值是多少,結果乙隻有1024,不夠用的。然後修改linux的配置檔案,修改 etc...