2009-10-10 72 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