Skip to content

Instantly share code, notes, and snippets.

@dequis
Created July 7, 2012 23:13
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save dequis/3068521 to your computer and use it in GitHub Desktop.
Save dequis/3068521 to your computer and use it in GitHub Desktop.
mc3p asyncore based listener
diff --git a/mc3p/proxy.py b/mc3p/proxy.py
index d40627e..b2bc174 100644
--- a/mc3p/proxy.py
+++ b/mc3p/proxy.py
@@ -81,18 +81,25 @@ and forward that connection to <host>:<port>."""
return (host, port, opts, pcfg)
-def wait_for_client(port):
- """Listen on port for client connection, return resulting socket."""
- srvsock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- srvsock.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
- srvsock.bind( ("", port) )
- srvsock.listen(1)
- logger.info("mitm_listener bound to %d" % port)
- (sock, addr) = srvsock.accept()
- srvsock.close()
- logger.info("mitm_listener accepted connection from %s" % repr(addr))
- return sock
-
+class ServerDispatcher(asyncore.dispatcher):
+ def __init__(self, locport, pcfg, host, port):
+ asyncore.dispatcher.__init__(self)
+ self.pcfg = pcfg
+ self.target_host = host
+ self.target_port = port
+
+ self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
+ self.set_reuse_addr()
+ self.bind(("", locport))
+ self.listen(5)
+ logger.info("ServerDispatcher bound to %d" % port)
+
+ def handle_accept(self):
+ pair = self.accept()
+ if pair:
+ sock, addr = pair
+ logger.info('Incoming connection from %s' % repr(addr))
+ MinecraftSession(pcfg, sock, self.target_host, self.target_port)
class MinecraftSession(object):
"""A client-server Minecraft session."""
@@ -251,18 +258,13 @@ if __name__ == "__main__":
# Install signal handler.
signal.signal(signal.SIGINT, sigint_handler)
- while True:
- cli_sock = wait_for_client(opts.locport)
-
- # Set up client/server main-in-the-middle.
- sleep(0.05)
- MinecraftSession(pcfg, cli_sock, host, port)
+ server = ServerDispatcher(opts.locport, pcfg, host, port)
- # I/O event loop.
- if opts.perf_data:
- logger.warn("Profiling enabled, saving data to %s" % opts.perf_data)
- import cProfile
- cProfile.run('asyncore.loop()', opts.perf_data)
- else:
- asyncore.loop()
+ # I/O event loop.
+ if opts.perf_data:
+ logger.warn("Profiling enabled, saving data to %s" % opts.perf_data)
+ import cProfile
+ cProfile.run('asyncore.loop()', opts.perf_data)
+ else:
+ asyncore.loop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment