第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

即使端口上沒有運行任何內(nèi)容,但綁定地址已在使用中的 golang 錯誤

即使端口上沒有運行任何內(nèi)容,但綁定地址已在使用中的 golang 錯誤

Go
拉風(fēng)的咖菲貓 2021-10-04 09:34:24
我在 golang 中有一個設(shè)置,它基本上從操作系統(tǒng)獲得一個免費端口,然后在它上面啟動一個 http 服務(wù)器。它開始出現(xiàn)端口注冊失敗的隨機錯誤。我將其簡化為以下程序,該程序在獲取一些空閑端口后似乎出錯。它非常隨機地發(fā)生,并且在它出錯的端口上沒有運行真正的進程。為什么這必須出錯對我來說根本沒有意義。任何幫助,將不勝感激。程序的輸出:....58479....588675886858869..必然好!58867綁定好!58868綁定好!58869......同時綁定端口2015年4月28日9時05分09秒錯誤:已在使用地址:聽TCP:58479:綁定我確保檢查出來的自由端口從未重復(fù)。package main import (    "net"    "net/http"    "log"    "fmt")func main() {    for {        l, _ := net.Listen("tcp", ":0")        var port = l.Addr().String()[5:]        l.Close()        fmt.Println(port)        go func() {                l1, err := net.Listen("tcp", ":"+port)                if (err != nil) {                    log.Fatal("Error while binding port: ", err.Error())                } else {                    fmt.Println("bound well! ", port)                }                http.Serve(l1, nil)            }()    }}
查看完整描述

2 回答

?
絕地?zé)o雙

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)。


查看完整回答
反對 回復(fù) 2021-10-04
?
隔江千里

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)閉。


查看完整回答
反對 回復(fù) 2021-10-04
  • 2 回答
  • 0 關(guān)注
  • 222 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號