2013-03-04 137 views
22

我試圖將套接字綁定到以下端口:綁定失敗:地址已在使用

if(bind(socket_desc,(struct sockaddr *) &server, sizeof(server)) < 0) 
{ 
    perror("bind failed. Error"); 
    return 1; 
} 
puts("bind done"); 

但它給:

$ ./serve 
Socket created  
bind failed. Error: Address already in use 

爲什麼會出現這種錯誤發生的呢?

+1

使用不同的端口號? – Nick 2013-03-04 10:01:10

+2

使用尚未使用的地址。 – 2013-03-04 10:02:02

+0

我明白了..我選擇不同的端口...感謝您的幫助.. 謝謝大家。 – TamiL 2013-03-04 10:18:56

回答

18

錯誤通常意味着您嘗試打開的端口已被另一個應用程序使用,請嘗試使用netstat查看哪些端口已打開,然後使用可用端口。

另外,請檢查您是否綁定到正確的IP地址(我假定這將是localhost)

+1

也可能是您正在運行網絡調試代理,如fiddler(http://www.telerik.com/fiddler)。我在我的機器上發現了同樣的錯誤,我關閉了提琴手,並且能夠繼續正常工作。 – farskeptic 2014-04-05 13:21:17

+1

也可以在TIME-WAIT狀態下有剩餘的端口。如果IP地址錯誤,則錯誤將是「無法分配請求的地址」,並且應假定的默認值不是「localhost」,而是INADDR_ANY。 – EJP 2017-04-23 10:44:02

15

您有一個已經在使用該端口的進程。 netstat -tulpn將使人能夠找到正在使用特定端口的進程ID。

36

大家是正確的。但是,如果您還在忙於測試您的代碼,那麼您的自己的應用程序可能仍會「擁有」該套接字,如果它啓動並停止得相對較快的話。嘗試SO_REUSEADDR作爲套接字選項:

SO_REUSEADDR究竟做什麼?

這個套接字選項告訴內核即使這個端口很忙(在 的TIME_WAIT狀態),繼續並重新使用它。如果它很忙, 但與另一個國家,你仍然會得到一個地址已經在使用 錯誤。如果您的服務器已關閉,然後 立即重新啓動,同時其端口上的套接字仍處於活動狀態,則此功能非常有用。您應該知道,如果有任何意外數據進入,它可能會混淆 您的服務器,但儘管這是可能的,但這不太可能。

有人指出,「套接字是一個5元組(原,當地 地址,本地端口,遠程地址,遠程端口)。SO_REUSEADDR只是說 可以重用本地地址。該5元組仍然必須是獨一無二的 !「作者Michael Hunter([email protected])。這是真的,而這個 就是爲什麼你的服務器不可能看到意外的數據。危險的是,這樣一個5元組仍然在網絡上漂浮着,並且當它彈跳時,來自同一客戶端的新連接 在同一個系統上恰好得到相同的 遠程端口。這由理查德史蒂文斯在``2.7請解釋TIME_WAIT狀態'請求 '解釋。''。

+1

https://easyengine.io/tutorials/nginx/troubleshooting/emerg-bind-failed-98-address-already-in-use/ 上面的鏈接只解決了我的問題...雖然我用(SO_REUSEADDR | SO_REUSEPORT)這個問題都發生了。 – 2016-03-04 09:47:04

+1

@iDebD_gh SO_REUSEPORT僅適用於UDP。 – EJP 2017-04-23 10:44:51

+0

請注意,如果有問題的端口位於Load Balancer後面,則SO_REUSEADDR可能會產生負面影響。 – kmarsh 2017-05-24 18:40:22

4

如上所述,端口已被使用。 這可能是由於幾個原因造成的

  1. 其他一些應用程序已經在使用它。
  2. 當您的程序正在等待另一端關閉program.refer(https://unix.stackexchange.com/questions/10106/orphaned-connections-in-close-wait-state)時,端口處於close_wait狀態。
  3. 程序可能處於time_wait狀態。您可以等待或使用另一個帖子中提到的套接字選項SO_REUSEADDR

執行netstat -a | grep <portno>來檢查端口狀態。

+6

我們如何在此端口號手動停止此應用程序? – user2925949 2016-04-20 06:07:39

+0

CLOSE-WAIT表示端口正在等待此端關閉它,而不是遠端。這就是你的鏈接所說的。 – EJP 2017-04-23 09:30:37

相關問題