2 回答

TA貢獻1946條經(jīng)驗 獲得超4個贊
您所做的是檢查端口是否在某一時刻空閑,然后根據(jù)過去它是空閑的事實嘗試使用它。這是行不通的。
會發(fā)生什么:在 for 循環(huán)的每次迭代中,您都會生成一個端口號并確保它是空閑的。然后您生成一個打算使用這個端口的例程(它已經(jīng)被釋放回空閑端口池)。你真的不知道這個例程什么時候開始。它可能在主例程(for 循環(huán))剛剛生成另一個空閑端口時被激活——也許又是同一個?或者也許另一個進程同時占用了這個端口。本質(zhì)上,您可以在單個端口上存在競爭條件。
經(jīng)過更多的研究:
不過有一個小警告。只要本地+遠程對是唯一的,兩個不同的套接字就可以綁定到同一個ip+端口。因此,當我創(chuàng)建偵聽器時,:0
我能夠獲得“碰撞”;證明netstat -an
:
10.0.1.11.65245????????*.*????????????????????LISTEN 10.0.1.11.65245????????17.143.164.101.5223????ESTABLISHED
現(xiàn)在,問題是如果您想顯式綁定正在使用的端口的套接字,這是不可能的。可能是因為您只能指定本地地址,而在調(diào)用偵聽或連接之前不會知道遠程地址(我們現(xiàn)在談?wù)摰氖窍到y(tǒng)調(diào)用,而不是 Go 接口)。換句話說,當您不指定端口時,操作系統(tǒng)有更廣泛的選擇。因此,如果發(fā)生這種情況,您的本地地址也正被另一個套接字使用,您將無法手動綁定到它。
如何解決:
正如我在評論中提到的,您的服務(wù)器進程應(yīng)該使用:0
符號,以便能夠從操作系統(tǒng)中選擇可用資源。一旦它開始偵聽,就應(yīng)該向感興趣的進程宣布地址。例如,您可以通過文件或標準輸出來實現(xiàn)。

TA貢獻1906條經(jīng)驗 獲得超10個贊
可能您之前在此端口上運行或調(diào)試應(yīng)用程序,并且它沒有完全關(guān)閉。該進程可能仍在您的系統(tǒng)內(nèi)存中。完全終止該進程,以及可能潛伏在陰影中的任何其他網(wǎng)絡(luò)守護進程,然后再次嘗試運行您的應(yīng)用程序。
如果您還沒有檢查過這一點,您可以使用(如果使用 Linux)top
、htop
或任何 GUI 系統(tǒng)監(jiān)視器,如 Windows' Task Manager
、Gnome3System Monitor
或 KDE'sKSysGuard
來搜索有問題的進程。
例如,我觀察到 Visual Studio Code 的調(diào)試器/運行器實用程序 (F5/Ctrl+F5) 并不總是清理進程,特別是如果您按 F5 太快并且舊的調(diào)試器沒有關(guān)閉。
- 2 回答
- 0 關(guān)注
- 222 瀏覽
添加回答
舉報