snippets / Port forwarding

Language: Python - First posted by slubman on 2007-10-16 00:03 (1 year, 1 month)
Link to the snippet: http://www.friendsnippets.org/snippet/93/

Manque à implémenter une façon d'arrêter le script !!

 1 #! /usr/bin/env python
2 #-*- coding: utf-8 -*-
3
4 import socket
5 import threading
6
7 class PipeThread(threading.Thread):
8 pipes = []
9 def __init__(self, sockInput, sockOutput, name):
10 threading.Thread.__init__(self)
11 self.setName(name)
12 self.pipes.append(self)
13 self.mydata = threading.local()
14 self.sockInput = sockInput
15 self.sockOutput = sockOutput
16
17 def run(self):
18 print self.getName(), "started !!"
19 while True:
20 try:
21 self.mydata.buffer = self.sockInput.recv(1024)
22 if not self.mydata.buffer:
23 break;
24 print self.getName(), " :", self.mydata.buffer[0:48]
25 self.sockOutput.send(self.mydata.buffer)
26 except KeyboardInterrupt:
27 sys.exit(0)
28 except:
29 break
30 print self.getName(), "ended !!"
31 self.sockInput.close()
32 self.sockOutput.close()
33 self.pipes.remove(self)
34
35
36 class PipeHole(threading.Thread):
37 def __init__(self, portInput, host, portOutput):
38 threading.Thread.__init__(self)
39 print "Redirecting : localhost:%s -> %s:%s" % (portInput, host, portOutput)
40 self.hostname = hostname
41 self.portOutput = portOutput
42 # Wait for incomings clients
43 self.sockMaster = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
44 self.sockMaster.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
45 self.sockMaster.bind(('', portInput))
46 self.sockMaster.listen(5)
47 print "Server is ready !!"
48
49 def run(self):
50 try:
51 while True:
52 # Accept a client connection
53 sockClient, addr = self.sockMaster.accept()
54 sRemote = socket.gethostbyaddr(addr[0])
55 print "Connection :", sRemote[0], sRemote[2] , ":", sockClient.getpeername()[1]
56 # Connect to server
57 sockServer = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
58 sockServer.connect((self.hostname, self.portOutput))
59 PipeThread(sockClient, sockServer, "Client").start()
60 PipeThread(sockServer, sockClient, "Server").start()
61 except KeyboardInterrupt:
62 sys.exit(0)
63 self.sockMaster.close()
64
65 if __name__ == '__main__':
66 import sys
67 try:
68 port = int(sys.argv[1])
69 hostname = sys.argv[2]
70 try:
71 new_port = int(sys.argv[3])
72 except IndexError:
73 new_port = port
74 except (IndexError, ValueError):
75 print "Usage: %s port hostname [new_port]" % sys.argv[0]
76 sys.exit(1)
77
78 try:
79 mainThread = PipeHole(port, hostname, new_port)
80 mainThread.start()
81 mainThread.join()
82 except KeyboardInterrupt:
83 sys.exit(0)
84
85 print "Shutting down !!"
86 #sys.exit(0)
In order to post a comment, you should have a friendsnippet account. Please sign-in.

0 comments

Oct '07
  • Manque à implémenter une façon d'arrêter le script !!

  • code interessant pour forwarder un port rapidement avec python.

Common Tags



snippet History

Oct '07