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對下面的字型設定略通一二以後,才知道控制台原來可以看著這麼舒服的,看網頁也可以不用那麼累人。現在再回...