2009-10-25 33 views
3

我正在執行一項服務 - 用Python編寫,運行在Debian GNU/Linux上的Twisted框架 - 檢查SIP服務器的可用性。爲此,我使用OPTIONS方法(一種SIP協議功能),因爲這似乎是一種常見的做法。爲了構建正確和RFC兼容的標頭,我需要知道將要建立的連接的源IP地址和源端口。 [如何]可以通過Twisted完成?扭曲:出站連接的源IP地址

這是我的嘗試: 我子類protocol.DatagramProtocol和內startProtocol(self)我用self.transport.getHost().hostself.transport.getHost().port。後者確實是將被使用的港口,而前者僅產生0.0.0.0。

我想在這一點上Twisted並不知道哪個接口以及哪個源IP地址將被使用。 Twisted是否提供了一個可以幫助我的工具,或者是否需要以不同的方式與操作系統(路由)進行交互?或者我錯誤地使用了self.transport.getHost().host

回答

8

爲了完整起見,我回答我的問題:

確保您使用試圖確定主機的源IP地址之前連接()的運輸。以下摘錄顯示了協議實現的相關部分:

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 
+0

在您發佈問題幾乎一個月後,您就投票贊成您提供答案,並且讓我非常簡單地發現運輸對象違背自我。 – Mayhem 2015-08-13 01:42:16

0

如果使用UDP則端點是由兩種決定:

  1. 呼籲在插座上bind()並明確給它一個地址
  2. 發送數據包

如果你想有一個幾個更多的細節,check this response

問題是我不太熟悉扭曲。從我可以通過快速瀏覽源代碼可以看出,看起來您可能想要使用類似t.i.d.SelectReactor的反應堆。這是什麼t.n.d.DNSDatagramProtocol does under the hood

如果你把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(),然後設置。

現在困難的部分是在扭曲提供的抽象範圍內完成這個工作。不幸的是,我在那裏幫不了很多忙。我建議尋找關於如何訪問底層套接字的示例或找到將套接字信息傳遞到框架的方法。

祝你好運。

+0

你的回答將是巨大的,如果這個問題不明確有關如何使用雙絞線做,但在這種情況下它不會真正的幫助。 – daf 2009-12-26 21:36:29

0

您是否看到您想要做的事情是否可以使用Twisted的SIP實現?

在任何情況下,如何設置Twisted中UDP的源地址和端口與您在沒有Twisted的情況下設置它們的方式非常相似。在Twisted中,reactor.listenUDP(port, protocol, interface)將UDP套接字綁定到特定的端口和接口,並處理接收到的數據報到您的協議。在協議內部,​​使用該協議綁定的地址作爲源地址向addr發送數據報。

再次讀你的問題,我認爲你唯一缺少的部分是通過interfacereactor.listenUDP(...)

+0

我用了一點Twisted的SIP實現來生成一些所需的頭文件。 – paprika 2009-11-18 18:55:08