Вручную дать витой (веб) сетевой стек пакет для обработки? - PullRequest
1 голос
/ 10 октября 2009

Я использую HTTP-сервер, используя витую структуру. Есть ли способ, которым я могу «вручную» попросить его обработать некоторую полезную нагрузку? Например, если я сконструировал какой-либо фрейм Ethernet, могу ли я попросить Twisted реактор обработать его так же, как если бы он только что прибыл на мою сетевую карту?

Ответы [ 2 ]

2 голосов
/ 28 декабря 2011

Вы можете сделать что-то вроде этого:

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

он должен работать как положено, с запросом от nc-сервера на порту 9000, передаваемым в качестве полезной нагрузки на витой веб-сервер, и ответ возвращается, как и ожидалось.

Ключевые строки находятся в SomeClient.dataRectained (). Вам понадобится транспортный объект с правильными методами - в приведенном выше примере я просто украл объект из клиентского соединения. Если вы не собираетесь этого делать, я полагаю, вам придется создать его, так как стеку нужно будет выполнять такие действия, как вызов getPeer ().

0 голосов
/ 25 октября 2009

Что такое сценарий использования?

Возможно, вы хотите создать свой собственный протокол дейтаграмм

На базе, место, где вы на самом деле реализовать протокол разбор и обработка, это Класс DatagramProtocol. Этот класс обычно происходит от twisted.internet.protocol.DatagramProtocol. Большинство обработчиков протоколов наследуют либо из этого класса или из одного из его удобство детей. Класс DatagramProtocol получает дейтаграммы, и может отправить их через сеть. Полученные дейтаграммы включите адрес, который они были отправлены от и при отправке дейтаграмм адрес для отправки должен быть указан.

Если вы хотите видеть передачи на проводном уровне, а не внедрять их, установите и запустите WireShark, фантастический бесплатный анализатор пакетов .

...