2010-02-25 66 views
61

我試圖用C編寫一個服務器程序, 使用另一個客戶端,例如,當我嘗試通過端口2080連接時出現此錯誤。連接拒絕錯誤的原因是什麼?

connection refused 

可能是這個錯誤的原因是什麼?

+0

我剛剛得到了這個錯誤,因爲我託管我的網站的服務器出錯。服務器仍然可以「ping」,http://www.downforeveryoneorjustme.com/表明它不僅僅是我,我還可以通過FTP訪問它。幾分鐘後,錯誤得到解決。 – 2014-12-01 16:39:23

+1

@moose:ping不會告訴您是否可以訪問特定端口廣告監聽,只有IP地址是否可達。但'connect()'取決於一個特定的IP和端口正準備使用。 – 2015-05-21 19:02:27

+0

服務器故障有一個關於[拒絕連接]的規範問題(http://serverfault.com/questions/725262/what-c​​auses-the-connection-refused-message)。 – Raedwald 2015-09-30 12:34:24

回答

54

可能有很多原因,但最常見的是:

  1. 端口未在目標計算機上打開。

  2. 端口在目標機器上是打開的,但其待處理連接的積壓已滿。

  3. 客戶端和服務器之間的防火牆阻止了訪問(也檢查本地防火牆)。

檢查防火牆和端口是開放後,使用telnet連接到IP /端口來測試連接。這可以消除應用程序中的任何潛在問題。

+5

防火牆通常會發出超時錯誤,因爲連接(SYN)數據包剛被丟棄。拒絕連接是因爲服務器已收到並拒絕了SYN數據包。 – CuriousPanda 2010-02-25 11:04:37

+12

並非總是如此,因爲防火牆可以配置爲拒絕而不是丟棄數據包。 – 2010-02-25 11:05:43

+0

連接()與不正確的服務器IP地址和端口號配置在客戶端程序中也會導致errno 111. – smRaj 2015-01-14 21:59:16

7

連接被拒絕表示您嘗試連接的端口實際上並未打開。

因此,無論您是連接到錯誤的IP地址,還是連接到錯誤的端口,或者服務器正在偵聽錯誤的端口,或者實際上沒有運行。

結合或以網絡字節順序連接時,一個常見的錯誤是沒有指定端口號...

+2

這只是可能導致錯誤的幾種可能條件之一。 – 2015-05-21 18:56:20

+1

該端口可以打開,但仍可能發生此錯誤。 – 2016-04-22 13:48:41

3

檢查在這是在端口上的監聽服務器端2080 首先試圖確認它的服務器的機器發出的telnet到該端口:

遠程登錄本地主機2080

如果聽,它是能夠應對。

52

該錯誤意味着偵聽套接字的操作系統識別入站連接請求,但選擇故意拒絕它。

假設中間防火牆沒有阻礙,只有兩個原因(我知道)讓操作系統拒絕入站連接請求。一個原因已經被多次提及 - 連接到的監聽端口未打開。

還有一個原因還沒有提到 - 偵聽端口實際上是開放的並且正在被使用,但是它的排隊入站連接請求的積壓達到了最大值,因此沒有空間可用於入站連接請求在那個時候排隊。服務器代碼尚未調用accept()足夠的時間來完成清除新隊列項目的可用插槽。

稍等片刻,再次嘗試連接。不幸的是,沒有辦法區分「港口根本不開放」和「港口開放但現在太忙」。他們都使用相同的通用錯誤代碼。

+3

這裏還有一個邊緣案例:http://www.softlab.ntua.gr/facilities/documentation/unix/unix-socket-faq/unix-socket-faq-3.html#ss3.6。基本上,如果你正在對你的客戶/服務器應用程序進行壓力測試,並且你正在使用3.6中提到的天真方法,那麼「連接​​被拒絕」錯誤可能會發生,這與上述兩種情況是不同的。 – ernesto 2014-04-17 07:26:48

+0

這需要upvoted。一旦明顯的原因(沒有聽到)得到解決,那麼這實際上是最可能的解釋,修復它可能是一個複雜的問題。 – 2017-11-29 12:11:10

+0

如果排隊入站請求的積壓達到最大值,我們該如何解決? – ACarter 2018-01-26 11:45:48

0

從Checkpoint防火牆的角度來看,如果您實際選擇拒絕作爲操作,您將看到來自防火牆的消息,從而向攻擊者暴露服務器前面的防火牆。防火牆將默默刪除與策略不匹配的所有連接。拒絕連接幾乎總是來自服務器

1

儘管您的情況似乎不是這種情況,但有時連接拒絕錯誤也可能表明您的網絡上存在IP地址衝突。您可以通過運行搜索可能的IP衝突:

arp-scan -I eth0 -l | grep <ipaddress> 

arping <ipaddress> 

This AskUbuntu問題有一些更多的信息也。

0

我的工作電腦出現同樣的問題。 的問題是,當你輸入localhost它關係到代理服務器的地址不是本地地址,你應該繞過它遵循這個步驟

鉻=>設置=>更改代理服務器設置=>局域網設置=>選中對於本地地址不使用代理服務器。

12

如果你試圖打開一個TCP連接到另一臺主機,並看到錯誤「拒絕連接」,這意味着

  1. 您發送一個TCP SYN包到其他主機。
  2. 然後您收到一個TCP RST數據包作爲回覆。

RST位於TCP數據包上,表示應該重置連接。通常這意味着其他主機已收到您的連接嘗試,並且正在主動拒絕您的TCP連接,但有時中間的防火牆可能會阻止您的TCP SYN數據包並將TCP RST發回給您。

https://tools.ietf.org/html/rfc793第69頁:

SYN後狀態

If the RST bit is set 

    If this connection was initiated with a passive OPEN (i.e., 
    came from the LISTEN state), then return this connection to 
    LISTEN state and return. The user need not be informed. If 
    this connection was initiated with an active OPEN (i.e., came 
    from SYN-SENT state) then the connection was refused, signal 
    the user "connection refused". In either case, all segments 
    on the retransmission queue should be removed. And in the 
    active OPEN case, enter the CLOSED state and delete the TCB, 
    and return. 
-1

我有同樣的消息,一個完全不同的原因:wsock32.dll沒有被發現。 ::socket(PF_INET, SOCK_STREAM, 0);調用保持返回INVALID_SOCKET,但原因是winsock dll未加載。

最後,我啓動了Sysinternals的進程監視器,注意到它搜索的是「無處不在」的DLL,但沒有找到它。

沉默的失敗是偉大的!

+0

INVALID_SOCKET與'拒絕連接'無關。只有在您的代碼缺少必需的錯誤處理時,纔會發生「無聲失敗」。 – EJP 2017-08-16 10:41:12

+0

你的意思是我應該檢查一下dll是否被加載了?你可能是對的。 – xtofl 2017-08-16 14:02:19

1

1.檢查您的服務器狀態。

2.檢查端口狀態。

例如3306 netstat -nupl|grep 3306

3.檢查您的防火牆。 例如增加3306

vim /etc/sysconfig/iptables 
# add 
-A INPUT -p tcp -m state --state NEW -m tcp --dport 3306 -j ACCEPT 
0

在Ubuntu中,嘗試 sudo ufw allow <port_number> 允許兩個服務器和數據庫的防火牆訪問。