私は単純なWebサーバーを作成しています。私は、ユーザがサーバが聞いているポートを に設定するようにしたいと思いますが、ユーザの入力が既に使用されているかどうかはどうすればわかりますか?(すでに使用されているとわかっていれば、もう1つ)Linux上のポートですでにポートが使用されているかどうかを検出するにはどうすればよいですか?
答えて
ポートにbind
を単に入力し、失敗した場合はをerrno
にチェックしてください。これは唯一の方法です。正しいものであるためには、そのようなチェックはアトミックでなければなりません。別のチェックを行ってポートが使用されていないことを確認した後でバインドしようとすると、その間に別のプロセスがポートにバインドされ、再度失敗する可能性があります。同様に、別のチェックを行い、すでに使用中のポートが見つかった場合は、そのポートを使用していたプロセスが、途中でポートを閉じたり、終了したり、クラッシュしたりして、結果を不正確にする可能性があります。
すべての点(私が短い答えではなく長い答えを書いた理由)は、「そういうことをすることができますか?ほとんどいつもにそれをしようとすると、と失敗を確認してください。他の方法では競合状態に陥る可能性があり、多くの場合競合状態(おそらくあなたのものではない)は競合状態がセキュリティ上の脆弱性です。
bind()
は失敗します:
、ゼロが返されます。エラーの場合、-1が返され、errnoが適切に設定されます。
EADDRINUSE 指定されたアドレスはすでに使用されています。
もう1つの方法:localhost
のポートに接続してみます。
これは悪い考えで、このテストが失敗する可能性がある理由をいくつか追加してください。答えは価値があるかもしれません... –
a)実行中のサーバが特定のインターフェースをlistenし、 'localhost'への接続がそれをチェックしません; b)タイムアウト。 c)この方法を使用して、TCPサーバーを別のプロセスとして開始するようにポートをチェックしました(失敗時に適切なエラーコードが返されないため、チェックするしかありません)。 – khachik
ちなみに、ポートをバインドして原子的にテストしても、(a)は問題になります。 0.0.0.0:portで接続が成功したとしても、すでに他のプロセスがaaa.bbb.ccc.ddd:port(外部ネットワークアドレスのIP)にバインドしている可能性があります。 –
bind()が何らかのエラーを表示する場合
ソケットを作成してbind()を呼び出すだけです。 bind()が成功した場合はlisten()に進みます。そうしないと、デフォルトのポートに切り替えたり、エラーメッセージを表示したり、対話を待つか、少なくともログアウトして終了するなど、何らかのエラー処理手順を実行する必要があります。
- 1. JSまたはJQueryを使用してURLにポートIDがあるかどうかを検出するにはどうすればよいですか?
- 2. MacPortsでポートをリセットするにはどうすればよいですか?
- 3. Windowsですでに使用されている場合、アンドロイドエミュレータにポート1900を使用させるにはどうすればよいですか?私は、UPnPポート1900を使用してデバイスを検索するアンドロイドアプリケーションを書いているが、私はエミュレータにtelnetポートはそうのようなリダイレクト設定しようとすると、
- 4. Linuxでファイルアクセスを検出するにはどうすればよいですか?
- 5. ファイルがネットワーク上にあるかどうかを検出するにはどうすればよいですか?
- 6. どのポートがDirectoryEntryで使用されていますか?
- 7. ポートが使用されているかどうかを確認しますか?
- 8. ファイアウォールアプライアンスのポートをプログラムで開くにはどうすればいいですか?
- 9. 送信ポートがブロックされているかどうかの検出
- 10. DjangoサーバをGoogleクラウド上でポート8000で実行するにはどうすればよいですか?
- 11. ローカルIIS、ポート番号を使用してURLをマップするにはどうすればよいですか?
- 12. 非標準ポートから.NET Webサービスを使用するにはどうすればよいですか?
- 13. Java:InetAddressから接続されたポートを取得するにはどうすればよいですか?
- 14. Androidでは、カードックのUSBポートに接続されたヘッドセットを使用するようにアプリに指示するにはどうすればよいですか?
- 15. ラズベリーパイのTCPポートを開くにはどうすればいいですか?
- 16. Google TestでLinux上のスレッド数を検出するにはどうすればよいですか?
- 17. Androidアプリが韓国で使用されているかどうかを検出するにはどうすればよいですか?
- 18. アプリケーションがドキュメントベースであるかどうかを検出するにはどうすればよいですか?
- 19. Elixir/Erlangでは、どのポートが `Node.connect`に使用されていますか?
- 20. ファイルがUTF-8を使用してエンコードされているかどうかを検出するにはどうすればよいですか?
- 21. Linux OSでcomポート(rs422)を開くにはどうすればよいですか?
- 22. スクリプトマネージャーがページにあるかどうかを検出するにはどうすればよいですか?
- 23. タッチイベントがEditText内にあるかどうかを検出するにはどうすればよいですか?
- 24. クライアント側のJavaScriptでポートの可用性を確認するにはどうすればよいですか?
- 25. WindowsでTCP/IPポートが既に使用されているかどうかを確認しますか?
- 26. ポート465と587がPHPで開いているかどうかを確認するにはどうすればよいですか?
- 27. コンパイラオプション(アサーションなど)がONに設定されているかどうかをランタイムで検出するにはどうすればよいですか?
- 28. Webdriver Firefoxがlocalhostに接続するポートを変更するにはどうすればよいですか?
- 29. ファイル入力にファイルが選択されているかどうかをJQueryを使って検出するにはどうすればよいですか?
- 30. Linuxシステムでポートが開いているかどうかを知る方法
しかし、このように私はサーバーソケットを作成しなければなりません... bind()...それを閉じます..そこにはもっと簡単な方法がありますか? – wong2
いいえ、それは唯一の正しい方法です。とにかくそれを閉じたいのはなぜですか?すでにバインドしているかどうかを聞くために単に使用してください。その間に別のプロセスがそのポートにバインドしている可能性があるかどうかは分かりません。 – ThiefMaster
@ wong2:私の答えを読んでください。ポートをバインドして、使用準備が整うまでポートをバインドしない限り、問題を解決する方法はありません(「ポートはすでに使用されていますか?」)。事前にチェックして(そしてそれを解放する)間違った答えが出されることがあります。 –