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