關於socket物件在xp下的乙個詭異問題

2021-08-20 10:34:24 字數 1598 閱讀 8895

1.因公司需求裝了幾台xp老機器;結果各種奇詭譎閃爍的情況出現了。

socket通訊線程裡:

2.在主線程建構函式中:建立 socket物件

qudpsocket s1 = new qudpsocket(this);

s1 -> bind(qudpsocket:: reuseaddresshint, port_recv);  //recv和send是同乙個埠; 6110

3.在 ::run() 裡

又重新new了socket()物件,qudpsocket s2 = new qudpsocket(this); 去在while(1)中傳送輪詢:

s2 -> bind(qudpsocket:: reuseaddresshint, port_send);   //收發使用同乙個埠,

4.main函式啟動執行緒;

object -> start();

然後.......

有時候能 發出去,並且收到響應,兩個socket工作正常;

有時候發出去,收不到響應;

......我寫的 **不可能有bug,js不錯不影響頁面功能,ie10根本沒有使用者;

因為原來程式在win7 32位環境下開發,所以優先懷疑作業系統;

1.拿到win7,win10一跑,不會出現時而連的上,時而連不上的問題;

一直很穩定的傳送、接受都能繫結成功;

2.然後再拿到xp,還是不行;

3.然後又回到了軟體本身;

4.通過wireshark和網口除錯助手抓包、監控發現,連線失敗時,收不到裝置發來的輪詢響應;

5.然後在發和收的地方加斷點,發現收的斷點那塊**進不去;

6.然後在收的埠繫結處加列印,發現程式沒有執行到繫結收埠這一步。

7.然後懷疑收的socket物件沒有建立起來,埠繫結也沒有成功;

8.然後基本定位是 socket物件和繫結埠的問題;

9.然後更改繫結順序,先繫結發,後幫定收,結果還是存在時而繫結上,時而繫結不上的問題;

10,然後再看列印,埠繫結處一處成功,一處失敗;

11,然後乾脆子執行緒也使用建構函式中的同乙個socket物件,在這裡說明一點:

因為:收發共用乙個埠:

port_send = port_recv;

s1 -> bind(qudpsocket:: reuseaddresshint, port_recv);

s2 -> bind(qudpsocket:: reuseaddresshint, port_send);

所以這裡可能是埠重複繫結時衝突,這種情況的概率在1/3左右,或許和xp系統有關;

但同時右半部分為同乙個物件,兩個指標指向同乙個物件,似乎這裡也值得懷疑;

然後修改為收發使用同乙個socket物件,也就是說埠只繫結一次,這樣也不存在收發的先後順序,更不會重複和衝突;

然後,ok了,試了20多次,很穩定。

總結一下:主要還是心態:

對於沒有遇到過的詭異問題,不要先急著甩鍋給硬體,先懷疑自己,把**可能出問題的每個環節檢查、斷點除錯、日誌列印一遍;

網路程式設計要結合使用網路除錯和檢測工具,尤其是在多裝置連線時,往往事半功倍,出其不意;

最重要的還是心態和認知問題,只為成功找理由,不為失敗找方法。

關於Socket傳輸物件

最近有個專案關於用socket傳輸物件話不多說直接上 服務端thread tcpthread new thread new threadstart listen tcpthread.start 啟動乙個子執行緒來呼叫socket的監聽方法 socket socketaccpet public voi...

xp下建立DOMDocument物件失敗的解決方法

前段時是寫關於msxml的東西,工程的主要內容是關於xml檔案的讀取,顯示 修改及儲存。工程環境是vs2010,系統是win7。實現完成後,去測試部一測,無法讀取檔案。寫好的程式居然不能用。測試的機器系統是xp,經理一句,你再回去改一下。在xp的機器上跟蹤一下,顯示錯誤 無法建立domdocumen...

關於XP的字型

人生活在貧民區的時候,就不會感慨外面的世界有多精彩。等哪天飛黃騰達了再回來看的時候,往往無法理解以前是怎麼熬過來的。從xp進化到vista,再折騰到ubuntu,可謂大開了一番眼界。尤其是ubuntu對下面的字型設定略通一二以後,才知道控制台原來可以看著這麼舒服的,看網頁也可以不用那麼累人。現在再回...