tcp socket繫結(bind)失敗

2021-12-30 04:03:39 字數 1416 閱讀 4924

tcp_socket繫結(bind)失敗---address already is use原因。

我們前面介紹了三種tcp_server編寫多程序多執行緒伺服器編寫,在測試這三個servet我們遇到乙個問題,就是當我們繫結乙個埠號後,ctrl-z結束掉server伺服器,此時再次繫結該埠號會出現這樣的出錯提示:

顯示埠號正在被使用,可是我們已經關閉了伺服器了,為什麼不能使用呢?但過一端時間之後,該埠號又可以使用了,這又是為什麼呢?

ibm官網給出了具體解釋linux套接字程式設計的五大隱患

其中,對於上述問題的描述是:

隱患 3.位址使用錯誤(eaddrinuse)

您可以使用 bind api 函式來繫結乙個位址(乙個介面和乙個埠)到乙個套接字端點。可以在伺服器設定中使用這個函式,以便限制可能有連線到來的介面。也可以在客戶端設定中使用這個函式,以便限制應當供出去的連線所使用的介面。bind 最常見的用法是關聯埠號和伺服器,並使用萬用字元位址(inaddr_any),它允許任何介面為到來的連線所使用。

bind 普遍遭遇的問題是試圖繫結乙個已經在使用的埠。該陷阱是也許沒有活動的套接字存在,但仍然禁止繫結埠(bind 返回 eaddrinuse),它由 tcp 套接字狀態 time_wait 引起。該狀態在套接字關閉後約保留 2 到 4 分鐘。在 time_wait 狀態退出之後,套接字被刪除,該位址才能被重新繫結而不出問題。

等待 time_wait 結束可能是令人惱火的一件事,特別是如果您正在開發乙個套接字伺服器,就需要停止伺服器來做一些改動,然後重啟。幸運的是,有方法可以避開 time_wait 狀態。可以給套接字應用 so_reuseaddr 套接字選項,以便埠可以馬上重用。

考慮清單 3 的例子。在繫結位址之前,我以 so_reuseaddr 選項呼叫 setsockopt。為了允許位址重用,我設定整型引數(on)為 1 (不然,可以設為 0 來禁止位址重用)。

我的理解:tcp的斷開連線是乙個四次揮手的過程,假設客戶端先斷開連線,此時伺服器端向客戶端傳送斷開請求時,客戶端處於time_wait,這個時間是2msl,確保伺服器端能夠收到確認訊息,正常退出,也就是說,在這個時間過程中,伺服器是沒有斷開連線的,那麼埠號就一直被占用,知道2msl時間過後。伺服器斷開連線,釋放資源。

修改方法:

在socket和bind之間加上sesockopt函式。

再再次請求相同的位址和埠號時,需要ctrl-c調之前開的伺服器,否則,它將一直處於 listen狀態

bind繫結引數

const curry fn args fn.bind null,args const split curry spliton,str str.split spliton console.log split hello js hello js 這個函式初看一頭霧水,split 被連續呼叫,但是兩個引...

引數繫結bind

bind可以看作乙個函式介面卡,接受乙個可呼叫物件生成乙個新的可呼叫物件來適應原物件的引數列表。形式 auto newcallable bind callable,arg list newcallable本身是乙個可呼叫物件,arg list是乙個逗號隔開的引數列表,對應callable中的引數。當...

10 3 4引數繫結 bind

count if演算法,類似find if,此函式接受一對迭代器,表示乙個輸入範圍,還接受乙個謂詞,會對輸入範圍中的每個元素執行。count if返回乙個計數值,表示謂詞有多少次為真。使用bind函式必須包含標頭檔案functional且必須包含命名空間placeholders,該命名空間也包含於f...