別のクライアントを使用してCでサーバープログラムを作成しようとしています。たとえば、ポート2080を介して接続しようとすると、このエラーが発生します。
connection refused
このエラーの原因は何ですか?
connect()
、特定のIPとポートが使用できる状態であるかどうかに依存します。
別のクライアントを使用してCでサーバープログラムを作成しようとしています。たとえば、ポート2080を介して接続しようとすると、このエラーが発生します。
connection refused
このエラーの原因は何ですか?
connect()
、特定のIPとポートが使用できる状態であるかどうかに依存します。
回答:
多くの理由が考えられますが、最も一般的な理由は次のとおりです。
ポートが宛先マシンで開いていません。
宛先マシンでポートが開いていますが、保留中の接続のバックログがいっぱいです。
クライアントとサーバー間のファイアウォールがアクセスをブロックしています(ローカルファイアウォールも確認してください)。
ファイアウォールをチェックし、ポートが開いていることを確認したら、Telnetを使用してIP /ポートに接続し、接続をテストします。これにより、潜在的な問題がアプリケーションから削除されます。
エラーは、リスニングソケットのOSがインバウンド接続要求を認識したが、意図的に拒否することを選択したことを意味します。
中間ファイアウォールが邪魔にならないと仮定すると、OSがインバウンド接続要求を拒否する理由は2つだけです(私が知っています)。1つの理由はすでに何度か言及されています-接続されているリスニングポートが開いていません。
まだ言及されていない別の理由があります-リスニングポートは実際に開いており、アクティブに使用されていますが、キューに入れられたインバウンド接続要求のバックログが最大に達したため、インバウンド接続要求をキューに入れるための空き容量がありません瞬間。サーバーコードは、新しいキューアイテムの使用可能なスロットのクリアを完了するのに十分な回数、accept()を呼び出していません。
しばらく待ってから、接続を再試行してください。残念ながら、「ポートがまったく開いていない」と「ポートは開いているがビジーである」を区別する方法はありません。どちらも同じ一般的なエラーコードを使用します。
別のホストへのTCP接続を開こうとすると、「接続が拒否されました」というエラーが表示される場合は、
RSTはTCPパケットのビットであり、接続をリセットする必要があることを示します。通常、これは他のホストが接続試行を受信し、TCP接続をアクティブに拒否していることを意味しますが、介在するファイアウォールがTCP SYNパケットをブロックし、TCP RSTを送信する場合があります。
https://tools.ietf.org/html/rfc793の 69ページを参照してください。
SYN-RECEIVED状態
RSTビットが設定されている場合
この接続がパッシブOPENで開始された場合(つまり、LISTEN状態からのもの)、この接続をLISTEN状態に戻して戻ります。ユーザーに通知する必要はありません。この接続がアクティブなOPENで開始された(つまり、SYN-SENT状態から来た)場合、接続は拒否され、ユーザーに「接続拒否」を通知します。どちらの場合も、再送信キューのすべてのセグメントを削除する必要があります。アクティブなOPENの場合は、CLOSED状態に入り、TCBを削除して戻ります。
接続が拒否されたことは、接続しようとしているポートが実際に開いていないことを意味します。
そのため、間違ったIPアドレスまたは間違ったポートに接続しているか、サーバーが間違ったポートでリッスンしているか、実際には実行されていません。
よくある間違いは、ネットワークバイトオーダーでバインドまたは接続するときにポート番号を指定しないことです...
チェックポイントファイアウォールの観点から見ると、アクションとして拒否を実際に選択すると、ファイアウォールのメッセージが表示され、サーバーの前にファイアウォールの存在が攻撃者にさらされます。ファイアウォールは、ポリシーに一致しないすべての接続を警告なしでドロップします。ほとんどの場合、サーバーからの接続拒否
職場のコンピューターでも同じ問題が発生します。問題は、localhostを入力すると、ローカルアドレスではなくプロキシのアドレスに移動し、次の手順に従ってバイパスする必要があることです。
Chrome =>設定=>プロキシ設定の変更=> LAN設定=>ローカルアドレスのプロキシサーバーをバイパスするを確認します。
ポートパラメータ "-p"を渡してみてください:
sudo iperf -c 127.0.0.1 -p 443
まったく異なる原因で同じメッセージが表示されました:wsock32.dll
が見つかりませんでした。::socket(PF_INET, SOCK_STREAM, 0);
呼び出しが戻っままINVALID_SOCKET
しかし理由は、Winsock DLLがロードされていなかったということでした。
結局、私はSysinternalsのプロセスモニターを起動し、「どこでも」dllを検索しましたが、見つからなかったことに気付きました。
サイレント障害は素晴らしいです!
ping
編集可能であり、downforeveryoneorjustme.comはそれが私だけではなく、FTP経由でもアクセスできることを示しました。数分後、間違いは解決されました。