ポートでリッスンし、次を使用してすべての着信接続を受け入れるpythonソケットサーバーがあります。
(conn, address) = socket.accept()
ただし、特定の IP アドレスからの接続のみを受け入れたいと考えています。
現在、アドレスが登録されていない場合は接続を閉じて、これを実現しています。
しかし、接続を受け入れてから閉じるのではなく、登録されていないアドレスからの接続を直接拒否することで、これを行うためのより良い方法はありますか?
ポートでリッスンし、次を使用してすべての着信接続を受け入れるpythonソケットサーバーがあります。
(conn, address) = socket.accept()
ただし、特定の IP アドレスからの接続のみを受け入れたいと考えています。
現在、アドレスが登録されていない場合は接続を閉じて、これを実現しています。
しかし、接続を受け入れてから閉じるのではなく、登録されていないアドレスからの接続を直接拒否することで、これを行うためのより良い方法はありますか?
Microsoft は、SO_CONDITIONAL_ACCEPT ソケット オプションを介してこの機能をサポートしているようです。
これには、接続を受け入れるために WSAAccept を使用する必要があるようです
この定数は、私の Windows 8 マシンの pythons ソケット モジュールには表示されません。Pythonの組み込みソケットモジュールを介してWSAAcceptを使用するオプションはないと思います。
私の理解が正しければ、これにより、ハンドシェイクを終了してFINパケットを交換する代わりに、サーバーがRSTパケットでSYNパケットにすぐに応答できるようになります。このフラグを使用すると、オペレーティング システムから接続を処理する責任が取り除かれ、アプリケーションに配置されるため、エラーやパフォーマンス ヒットが発生する余地が十分にあることに注意してください。パフォーマンスの向上が目標だった場合、追求する価値はないかもしれません
Windows では C レベルで実行できます。Pythonのctypesモジュールは C コードとのインターフェースを可能にするため、技術的には Python インターフェース経由で行うことができます。しかし、それにはおそらくかなりの労力が必要です。この機能が必要であると確信している場合は、すぐに使用できる C ソケット ライブラリを見つける方が簡単かもしれません。そのための ctypes ラッパーを作成できます。