web-dev-qa-db-ja.com

接続拒否エラーの理由は何ですか?

別のクライアントを使用して、Cでサーバープログラムを作成しようとしています。たとえば、ポート2080を介して接続しようとすると、このエラーが発生します。

connection refused

このエラーの原因は何ですか?

87
Zenet

多くの理由が考えられますが、最も一般的なものは次のとおりです。

  1. 宛先マシンでポートが開いていません。

  2. ポートは宛先マシンで開いていますが、保留中の接続のバックログはいっぱいです。

  3. クライアントとサーバー間のファイアウォールがアクセスをブロックしています(ローカルファイアウォールも確認してください)。

ファイアウォールを確認し、ポートが開いていることを確認したら、telnetを使用してip/portに接続し、接続をテストします。これにより、潜在的な問題がアプリケーションから削除されます。

73
a'r

このエラーは、リスニングソケットのOSが着信接続要求を認識したが、意図的にそれを拒否することを選択したことを意味します。

中間ファイアウォールが邪魔になっていないと仮定すると、OSが着信接続要求を拒否する理由は2つしかありません(私が知っている)。 1つの理由はすでに何度も言及されています-接続されているリスニングポートが開いていません。

まだ言及されていない別の理由があります-リスニングポートは実際に開いており、アクティブに使用されていますが、キューに入れられたインバウンド接続要求のバックログが最大に達しているため、インバウンド接続要求をキューに入れる余地がありません瞬間。サーバーコードは、accept()をまだ十分に呼び出していないため、新しいキューアイテムの使用可能なスロットのクリアが完了していません。

しばらく待ってから、接続を再試行してください。残念ながら、「ポートはまったく開いていません」と「ポートは開いていますが、現在ビジー状態です」を区別する方法はありません。どちらも同じ一般的なエラーコードを使用します。

62
Remy Lebeau

別のホストへのTCP接続を開こうとして、「接続が拒否されました」というエラーが表示された場合は、

  1. TCP SYNパケットを他のホストに送信しました。
  2. 次に、TCP RSTパケットを返信で受信しました。

RSTは、接続をリセットする必要があることを示すTCPパケットのビットです。通常、他のホストが接続試行を受信し、TCP接続を積極的に拒否していることを意味しますが、ファイアウォールが介在するとTCP SYNパケットがブロックされ、TCP RSTが戻ってきました。

https://tools.ietf.org/html/rfc79 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.
16
James Brock

接続拒否は、接続しようとしているポートが実際に開いていないことを意味します。

したがって、間違ったIPアドレスまたは間違ったポートに接続しているか、サーバーが間違ったポートでリッスンしているか、実際に実行されていません。

よくある間違いは、ネットワークバイト順でバインドまたは接続するときにポート番号を指定しないことです...

8
RedPandaCurios

サーバー側で、ポート2080でリッスンしていることを確認します。まず、そのポートにtelnetを発行して、サーバーマシンで確認を試みます。

telnet localhost 2080

リスニングしている場合、応答することができます。

5
Adil

あなたの状況には当てはまらないようですが、接続拒否エラーはネットワーク上でIPアドレスの競合があることを示すこともあります。次のコマンドを実行して、IPの競合の可能性を検索できます。

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

そして

arping <ipaddress>

これ AskUbuntuの質問にはさらに情報があります。

1
SnapShot

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
1
Jack Sun

職場のコンピューターでも同じ問題が発生します。問題は、localhostを入力すると、ローカルアドレスではなくプロキシのアドレスに移動するため、この手順に従ってバイパスする必要があることです

Chrome =>設定=>プロキシ設定の変更=> LAN設定=>ローカルアドレスのプロキシサーバーのバイパスをチェックします。

0

チェックポイントファイアウォールの観点から、実際にアクションとして拒否を選択すると、ファイアウォールのメッセージが表示されます。これにより、サーバーの前にあるファイアウォールの存在を攻撃者にさらします。ファイアウォールは、ポリシーに一致しないすべての接続を静かにドロップします。ほとんどの場合、接続はサーバーから拒否されます

0

Ubuntuでは、Sudo ufw allow <port_number>を試して、サーバーとデータベースの両方へのファイアウォールアクセスを許可します。

0
rajeeva9