145

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

connection refused

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

4

12 に答える 12

126

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

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

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

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

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

于 2010-02-25T11:02:44.480 に答える
84

このエラーは、リスニング ソケットの OS がインバウンド接続要求を認識したが、意図的に拒否したことを意味します。

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

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

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

于 2010-03-02T08:37:14.873 に答える
23

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

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

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

于 2010-02-25T11:03:27.947 に答える
7

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

telnet ローカルホスト 2080

聞いていれば対応できます。

于 2010-02-25T11:36:35.427 に答える
1

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

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

于 2013-08-21T06:03:37.000 に答える
1

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

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

arping <ipaddress>

このAskUbuntu の質問には、さらに詳しい情報もあります。

于 2013-01-15T17:35:00.317 に答える
0

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

于 2012-09-29T16:20:24.150 に答える