문제

나는 SIP 서버의 가용성을 확인하는 데비안 GNU/Linux에서 실행되는 트위스트 프레임 워크와 함께 파이썬으로 작성된 서비스를 구현하는 과정에 있습니다. 이를 위해서는 옵션 메소드 (SIP 프로토콜 기능)를 사용합니다. 이것은 일반적인 연습 인 것 같습니다. 올바른 및 RFC 호환 헤더를 구성하려면 설정 될 연결에 대한 소스 IP 주소와 소스 포트를 알아야합니다. [어떻게] 이것은 왜곡 된 상태로 할 수 있습니까?

이것이 내가 시도한 것입니다 : 나는 서브 클래스를 사용했다 프로토콜 .datagramprotocol 그리고 내부 startProtocol(self) 나는 사용했다 self.transport.getHost().host 그리고 self.transport.getHost().port. 후자는 실제로 사용될 포트 인 반면, 전자는 0.0.0.0 만 산출합니다.

이 시점에서 Twisted는 아직 [] 어떤 인터페이스와 어떤 소스 IP 주소를 사용할 것인지 알지 못한다고 생각합니다. Twisted는 이것에 도움이 될 수있는 시설을 제공합니까, 아니면 다른 방식으로 OS (라우팅)와 인터페이스해야합니까? 아니면 그냥 사용 했어요 self.transport.getHost().host 틀리게?

도움이 되었습니까?

해결책

완전성을 위해 나는 내 자신의 질문에 대답합니다.

호스트의 소스 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

다른 팁

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의 일부인 SIP 구현에서 원하는 것이 가능하는지 보셨습니까?

어쨌든 Twisted에서 UDP의 소스 주소와 포트를 설정하는 방법은 Twisted없이 설정하는 방법과 매우 유사합니다. 꼬인, reactor.listenUDP(port, protocol, interface) UDP 소켓을 특정 포트에 바인딩하고 인터페이스하고 수신 된 데이터 그램을 프로토콜에 처리합니다. 프로토콜 내부에서 self.transport.write(msg, addr) 데이터 그램을 보냅니다 addr 프로토콜이 소스 주소로 바인딩되는 주소를 사용합니다.

다시 당신의 질문을 읽었습니다. 당신이 놓친 유일한 부분은 지나가는 것 같아요 interface 에게 reactor.listenUDP(...).

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top