3

私は、SIP サーバーの可用性をチェックするサービス (Python で記述され、Twisted フレームワークを使用し、Debian GNU/Linux で実行される) を実装する過程にあります。これには、OPTIONS メソッド (SIP プロトコル機能) を使用します。これは一般的な方法のようです。正しい RFC 準拠のヘッダーを作成するには、確立される接続の送信元 IP アドレスと送信元ポートを知る必要があります。[どのように] Twisted でこれを行うことができますか?

これは私が試したことです: 私はprotocol.DatagramProtocolをサブクラス化し、その中で andstartProtocol(self)を使用self.transport.getHost().hostself.transport.getHost().portました。後者は実際に使用されるポートですが、前者は 0.0.0.0 しか生成しません。

この時点で、Twisted は [まだ?] どのインターフェースが使用されるか、どのソース IP アドレスが使用されるかを認識していないと思います。Twisted はこれを支援する機能を提供していますか、それとも別の方法で OS とのインターフェース (ルーティング) が必要ですか? それとも使い方をself.transport.getHost().host間違えただけ?

4

3 に答える 3

8

完全を期すために、私は自分の質問に答えます:

ホストの送信元 IP アドレスを特定する前に、必ずトランスポートで connect() を使用してください。次の抜粋は、プロトコル実装の関連部分を示しています。

class FooBarProtocol(protocol.DatagramProtocol):
    def startProtocol(self):
        self.transport.getHost().host   # => 0.0.0.0
        self.transport.connect(self.dstHost, self.dstPort)
        self.transport.getHost().host   # => 192.168.1.102
于 2009-11-18T18:46:04.420 に答える
0

UDPを使用している場合、エンドポイントは次のいずれかによって決定されます。

  1. ソケットを呼び出しbind()、明示的にアドレスを指定する
  2. パケットの送信

詳細が必要な場合は、この応答を確認してください

問題は、私がツイストにあまり慣れていないことです。ソースをざっと見てみると、代わりにのようなリアクターを使用したいと思うかもしれませんt.i.d.SelectReactor。これはt.n.d.DNSDatagramProtocol、内部で行うことです。

写真から取り出した場合twisted、次のスニペットは何が起こっているかを示しています。

>>> import socket
>>> s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM, 0)
<socket._socketobject object at 0x10025d670>
>>> s.getsockname()           # this is an unbound or unnamed socket
('0.0.0.0', 0)
>>> s.bind( ('0.0.0.0', 0) )  # 0.0.0.0 is INADDR_ANY, 0 means pick a port
>>> s.getsockname()           # IP is still zero, but it has picked a port
('0.0.0.0', 56814)

複数のネットワークインターフェイスまたはIPv4とIPv6をサポートする必要がある場合は、ホスト名を取得するのが少し難しいです。使用するインターフェースを構成可能にできる場合は、それをタプルの最初のメンバーとしてに渡します。これsocket.bind()で設定が完了します。

今、難しい部分は、twistedが提供する抽象化の範囲内でこれを行うことです。残念ながら、私はそこで多くを助けることはできません。基盤となるソケットにアクセスする方法や、ソケット情報をフレームワークに渡す方法の例を探すことをお勧めします。

幸運を。

于 2009-10-26T04:32:01.150 に答える
0

Twisted の一部である SIP 実装で、やりたいことが可能かどうかわかりましたか?

いずれにせよ、Twisted で UDP の送信元アドレスとポートを設定する方法は、Twisted なしで設定する方法と非常によく似ています。Twisted ではreactor.listenUDP(port, protocol, interface)、UDP ソケットを特定のポートとインターフェイスにバインドし、受信したデータグラムをプロトコルに処理します。プロトコル内で、プロトコルがバインドされているアドレスを送信元アドレスとして使用して にself.transport.write(msg, addr)データグラムを送信します。addr

あなたの質問をもう一度読んで、あなたが欠けていた唯一の部分はに渡しinterfaceていたと思いますreactor.listenUDP(...)

于 2009-11-01T13:51:09.173 に答える