手动为扭曲(网络)网络堆栈提供数据包进行处理?

时间:2009-10-10 01:09:29

标签: python twisted

我使用扭曲的框架运行HTTP服务器。有什么办法我可以“手动”要求它处理一些有效载荷吗?例如,如果我构建了一些以太网帧,我可以请求twisted的反应堆来处理它,就像它刚刚到达我的网卡一样吗?

2 个答案:

答案 0 :(得分: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()一样。

答案 1 :(得分:0)

用例是什么?

也许你想创建自己的Datagram Protocol

  

在基地,你所在的地方   实际上实现了协议   解析和处理,是   DatagramProtocol类。这个班   通常会脱离twisted.internet.protocol.DatagramProtocol。   大多数协议处理程序都继承   从这个班级或其中一个   方便的孩子。该   DatagramProtocol类接收   数据报,并可以发送出去   网络。收到数据报   包括他们发送的地址   来自,当发送数据报时   必须指定要发送到的地址。

如果您想要查看有线传输而不是注入它们,请安装并运行WireShark, the fantastic, free packet sniffer