From 4e7b1b7b23fb266df1f240db3a7be3e3032dab3e Mon Sep 17 00:00:00 2001 From: Ryan Williams Date: Sun, 28 Feb 2010 14:30:34 -0800 Subject: [PATCH] Added port forwarder example. --- doc/examples.rst | 8 +++++++- examples/forwarder.py | 24 ++++++++++++++++++++++++ 2 files changed, 31 insertions(+), 1 deletion(-) create mode 100644 examples/forwarder.py diff --git a/doc/examples.rst b/doc/examples.rst index 187d157..b1b8f94 100644 --- a/doc/examples.rst +++ b/doc/examples.rst @@ -54,4 +54,10 @@ Feed Scraper This example requires `Feedparser `_ to be installed or on the PYTHONPATH. -.. literalinclude:: ../examples/feedscraper.py \ No newline at end of file +.. literalinclude:: ../examples/feedscraper.py + +Port Forwarder +----------------------- +``examples/forwarder.py`` + +.. literalinclude:: ../examples/forwarder.py \ No newline at end of file diff --git a/examples/forwarder.py b/examples/forwarder.py new file mode 100644 index 0000000..1cc4fa4 --- /dev/null +++ b/examples/forwarder.py @@ -0,0 +1,24 @@ +""" This is an incredibly simple port forwarder from port 7000 to 22 on localhost. It calls a callback function when the socket is closed, to demonstrate one way that you could start to do interesting things by +starting from a simple framework like this. +""" + +import eventlet +def closed_callback(): + print "called back" + +def forward(source, dest, cb = lambda: None): + """Forwards bytes unidirectionally from source to dest""" + while True: + d = source.recv(32384) + if d == '': + cb() + break + dest.sendall(d) + +listener = eventlet.listen(('localhost', 7000)) +while True: + client, addr = listener.accept() + server = eventlet.connect(('localhost', 22)) + # two unidirectional forwarders make a bidirectional one + eventlet.spawn_n(forward, client, server, closed_callback) + eventlet.spawn_n(forward, server, client)