2

ポートでリッスンし、次を使用してすべての着信接続を受け入れるpythonソケットサーバーがあります。

(conn, address) = socket.accept()

ただし、特定の IP アドレスからの接続のみを受け入れたいと考えています。

現在、アドレスが登録されていない場合は接続を閉じて、これを実現しています。

しかし、接続を受け入れてから閉じるのではなく、登録されていないアドレスからの接続を直接拒否することで、これを行うためのより良い方法はありますか?

4

3 に答える 3

0

Microsoft は、SO_CONDITIONAL_ACCEPT ソケット オプションを介してこの機能をサポートしているようです。

これには、接続を受け入れるために WSAAccept を使用する必要があるようです

この定数は、私の Windows 8 マシンの pythons ソケット モジュールには表示されません。Pythonの組み込みソケットモジュールを介してWSAAcceptを使用するオプションはないと思います。

私の理解が正しければ、これにより、ハンドシェイクを終了してFINパケットを交換する代わりに、サーバーがRSTパケットでSYNパケットにすぐに応答できるようになります。このフラグを使用すると、オペレーティング システムから接続を処理する責任が取り除かれ、アプリケーションに配置されるため、エラーやパフォーマンス ヒットが発生する余地が十分にあることに注意してください。パフォーマンスの向上が目標だった場合、追求する価値はないかもしれません

Windows では C レベルで実行できます。Pythonのctypesモジュールは C コードとのインターフェースを可能にするため、技術的には Python インターフェース経由で行うことができます。しかし、それにはおそらくかなりの労力が必要です。この機能が必要であると確信している場合は、すぐに使用できる C ソケット ライブラリを見つける方が簡単かもしれません。そのための ctypes ラッパーを作成できます。

于 2015-06-13T23:19:52.787 に答える