首先,我们用webpy写一个简单的网站,监听8080端口,返回“Hello, EverET.org”的页面。
然后我们使用我们的forwarding.py,在80端口和8080端口中间建立两条通信管道用于双向通信。
此时,我们通过80端口访问我们的服务器。
浏览器得到:
然后,我们在forwarding.py的输出结果中可以看到浏览器和webpy之间的通信内容。
代码:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
|
#!/usr/bin/env python
import sys, socket, time, threading
loglock = threading.Lock()
def log(msg):
loglock.acquire()
try :
print '[%s]: \n%s\n' % (time.ctime(), msg.strip())
sys.stdout.flush()
finally :
loglock.release()
class PipeThread(threading.Thread):
def __init__( self , source, target):
threading.Thread.__init__( self )
self .source = source
self .target = target
def run( self ):
while True :
try :
data = self .source.recv( 1024 )
log(data)
if not data: break
self .target.send(data)
except :
break
log( 'PipeThread done' )
class Forwarding(threading.Thread):
def __init__( self , port, targethost, targetport):
threading.Thread.__init__( self )
self .targethost = targethost
self .targetport = targetport
self .sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
self .sock.bind(( '0.0.0.0' , port))
self .sock.listen( 10 )
def run( self ):
while True :
client_fd, client_addr = self .sock.accept()
target_fd = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
target_fd.connect(( self .targethost, self .targetport))
log( 'new connect' )
# two direct pipe
PipeThread(target_fd, client_fd).start()
PipeThread(client_fd, target_fd).start()
if __name__ = = '__main__' :
print 'Starting'
import sys
try :
port = int (sys.argv[ 1 ])
targethost = sys.argv[ 2 ]
try : targetport = int (sys.argv[ 3 ])
except IndexError: targetport = port
except (ValueError, IndexError):
print 'Usage: %s port targethost [targetport]' % sys.argv[ 0 ]
sys.exit( 1 )
#sys.stdout = open('forwaring.log', 'w')
Forwarding(port, targethost, targetport).start()
|