-
Notifications
You must be signed in to change notification settings - Fork 28
/
reprocks_server.py
executable file
·175 lines (147 loc) · 4.71 KB
/
reprocks_server.py
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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
#/usr/bin/python
import threading
import socket
import sys,time
import select
global bufLen
global endflag
endflag = []
bufLen = 4*1024
class control(threading.Thread):
def __init__(self,server_Conn,client_Conn,server_Addr,client_Addr,clientNum):
threading.Thread.__init__(self)
self.server_Conn = server_Conn
self.client_Conn = client_Conn
self.server_Addr = server_Addr
self.client_Addr = client_Addr
self.clientNum = clientNum
def run(self):
global endflag
global bufLen
transferDataThreads = []
thread = 2
flag = int(self.clientNum)
endflag.append(False)
y = transfer2Client(self.server_Conn,self.client_Conn,self.server_Addr,self.client_Addr,flag)
y.setDaemon(True)
z = transfer2Server(self.client_Conn,self.server_Conn,self.client_Addr,self.server_Addr,flag)
z.setDaemon(True)
transferDataThreads.append(y)
transferDataThreads.append(z)
try:
for t in transferDataThreads:
t.start()
except socket.timeout:
print "Time out occurd."
pass
while True:
alive = True
for i in range(int(thread)):
alive = alive and transferDataThreads[i].isAlive()
if not alive:
time.sleep(1)
print "\n[Link %s] closed." % (int(self.clientNum)+1)
break
break
class transfer2Client(threading.Thread):
def __init__(self,server_Conn,client_Conn,server_Addr,client_Addr,flag):
threading.Thread.__init__(self)
self.server_Conn = server_Conn
self.client_Conn = client_Conn
self.server_Addr = server_Addr
self.client_Addr = client_Addr
self.flag = flag
self.num = flag+1
def run(self):
global bufLen
global endflag
while True and not endflag[self.flag]:
buf = self.server_Conn.recv(bufLen)
if buf == '__closed__' or len(buf)==0:
print "[Link %s] Server %s disconnect.End current thread." % (self.num,self.server_Addr)
time.sleep(2)
self.server_Conn.close()
endflag[self.flag] = True
break
try: # maybe client disconnect.
self.client_Conn.send(buf)
print "[Link %s] %s --> %s : %s data" % (self.num,self.server_Addr,self.client_Addr,len(buf))
except:
self.server_Conn.send('__closed__')
self.server_Conn.close()
break
class transfer2Server(threading.Thread):
def __init__(self,client_Conn,server_Conn,client_Addr,server_Addr,flag):
threading.Thread.__init__(self)
self.client_Conn = client_Conn
self.server_Conn = server_Conn
self.client_Addr = client_Addr
self.server_Addr = server_Addr
self.flag = flag
self.num = flag+1
def run(self):
global bufLen
global endflag
while True and not endflag[self.flag]:
try:
buf = self.client_Conn.recv(bufLen)
except:
print "[Link %s] Client %s: disconnect.End current thread." % (self.num,self.client_Addr)
time.sleep(2)
self.server_Conn.send('__closed__')
self.client_Conn.close()
self.server_Conn.close()
endflag[self.flag] = True
break
if len(buf)==0: # means disconnect.
self.server_Conn.send('__closed__')
self.client_Conn.close()
endflag[self.flag] = True
break
self.server_Conn.send(buf)
print "[Link %s] %s --> %s : %s data" % (self.num,self.client_Addr,self.server_Addr,len(buf))
def usage():
print """
reprocks_server\tV1.0
Code by H.K.T \t email:jlvsjp@qq.com
usage: reprocks_server.py <ListenPort1> <ListenPort2>
"""
def main():
global endflag
if len(sys.argv)<>3:
usage()
sys.exit()
else:
port1 = int(sys.argv[1])
port2 = int(sys.argv[2])
controlThreads = []
try:
socketServer = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
socketServer.bind(('',port1))
socketServer.listen(20)
socketClient = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
socketClient.bind(('',port2))
socketClient.listen(20)
clientNum = 0 #the number of client connection.
while True:
currentLink = clientNum +1
print "[Link %s] Listening on port %s,waiting for server connect..." % (currentLink,port1)
serverConn,serverAddr = socketServer.accept()
print "[Link %s] Server %s connect! " % (currentLink,serverAddr)
while True:
print "[Link %s] Listening on port %s,waiting for client connect..." % (currentLink,port2)
client_Conn,client_Addr = socketClient.accept()
print "[Link %s] Get a client connection from %s !" % (currentLink,client_Addr)
serverConn.send('__newLink__') # send current client info,to create a new thread in reprocks_client to connect with current reprocks_server.
temp = control(serverConn,client_Conn,serverAddr,client_Addr,clientNum)
temp.setDaemon(True)
controlThreads.append(temp)
controlThreads[clientNum].start()
clientNum += 1
break
except KeyboardInterrupt:
print "Catch ctrl+c pressed,program will exit."
for m in endflag:
m = True
if __name__ == '__main__':
main()