2009-10-10 75 views
1

我使用扭曲的框架運行HTTP服務器。有什麼辦法可以「手動」要求它處理一些有效載荷?例如,如果我構建了一些以太網幀,我可以問一下扭曲的反應器來處理它,就像它剛到達我的網卡上一樣?手動給扭曲(網絡)網絡堆棧一個數據包進行處理?

+0

以太網幀的處理水平要比絞合處理的低得多,因此將其注入到網絡流中與絞合無關。 – Amok 2009-10-24 21:56:09

回答

2

你可以做這樣的事情:

from twisted.web import server 
from twisted.web.resource import Resource 
from twisted.internet import reactor 
from twisted.internet.protocol import Protocol, ClientFactory 

class SomeWebThing(Resource): 
    def render_GET(self, request): 
     return "hello\n" 

class SomeClient(Protocol): 
    def dataReceived(self, data): 
     p = self.factory.site.buildProtocol(self.transport.addr) 
     p.transport = self.transport 
     p.dataReceived(data) 

class SomeClientFactory(ClientFactory): 
    protocol = SomeClient 
    def __init__(self, site): 
     self.site = site 

if __name__ == '__main__': 
    root = Resource() 
    root.putChild('thing', SomeWebThing()) 
    site = server.Site(root) 
    reactor.listenTCP(8000, site) 

    factory = SomeClientFactory(site) 
    reactor.connectTCP('localhost', 9000, factory) 

    reactor.run() 

,並保存爲simpleinjecter.py,如果再(在命令行)做:

echo -e "GET /thing HTTP/1.1\r\n\r\n" | nc -l 9000 # runs a server, ready to send req to first client connection 
python simpleinjecter.py 

它應該工作的預期,來自端口9000上的NC服務器的請求被作爲有效負載集中到扭曲的Web服務器上,並且響應按照預期返回。

關鍵行在SomeClient.dataRecieved()中。你需要一個帶有正確方法的傳輸對象 - 在上面的例子中,我只是從客戶端連接中竊取對象。如果你不打算這樣做,我想你必須創建一個,因爲堆棧將要執行諸如調用getPeer()之類的操作。

0

什麼是用例?

也許你想創建自己的Datagram Protocol

在基地,在那裏你 實際實現協議 解析和處理的地方,是 DatagramProtocol類。這個類 通常來自twisted.internet.protocol.DatagramProtocol。 大多數協議處理程序都繼承此類或其子 中的一個 。 DatagramProtocol類接收 數據報,並可以通過網絡發送出 。接收到的數據報 包括它們從 發送的地址,並且在發送數據報時必須指定要發送到的地址 。

如果您想查看電線級變速箱而不是插入它們,請安裝並運行WireShark, the fantastic, free packet sniffer

+0

用例:我在兩臺計算機之間設置了隧道。一臺機器正在運行(扭曲)網絡服務器。當該機器通過隧道接收到TCP端口80的數據包時,我想對該數據包進行扭曲處理(就像它通過機器的NIC「正常」到達一樣)。當服務器生成TCP/IP回覆時,我想通過隧道將它們發回。 – 2009-10-25 15:17:30

+0

可以通過SSH隧道設置端口轉發。您可以運行HAProxy或類似的代替定製解決方案,並通過隧道將連接轉發到其他計算機上。 – 2009-10-25 21:03:07