代码之家  ›  专栏  ›  技术社区  ›  David Underhill

手动为twisted(web)网络堆栈提供一个要处理的数据包?

  •  1
  • David Underhill  · 技术社区  · 15 年前

    我正在使用twisted框架运行HTTP服务器。我有没有办法“手动”要求它处理一些有效负载?例如,如果我构建了一些以太网帧,我可以让twisted的reactor处理它,就像它刚刚到达我的网卡一样吗?

    2 回复  |  直到 15 年前
        1
  •  2
  •   Al P.    13 年前

    您可以这样做:

    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服务器的请求作为有效负载被导入twisted web服务器,响应按预期返回。

    关键行位于SomeClient.DataReceived()中。您需要一个具有正确方法的传输对象——在上面的示例中,我只是从客户机连接中窃取了该对象。如果您不打算这样做,我想您必须编一个,因为堆栈将需要对其执行诸如调用getPeer()之类的操作。

        2
  •  0
  •   Tom Leys    15 年前

    用例是什么?

    也许你想创造你自己的 Datagram Protocol

    实际执行协议 解析和处理,是 数据报协议类。这个班 通常将从twisted.internet.protocol.DatagramProtocol中分离。 从这个类或它的一个 方便儿童。这个 DatagramProtocol类接收 数据报,并且可以通过 包括他们发送的地址 在发送数据报时,从 必须指定要发送到的地址。

    WireShark, the fantastic, free packet sniffer .