-
Notifications
You must be signed in to change notification settings - Fork 1
/
tcp-srv.py
104 lines (77 loc) · 2.93 KB
/
tcp-srv.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
import socketserver
import tcplib
import os
import sys
import time
import random
import pickle
ver = '0.1'
class MyTCPHandler(socketserver.StreamRequestHandler):
def answer(self, message):
# Likewise, self.wfile is a file-like object used to write back
# to the client
try:
self.wfile.write(message.encode('utf-8'))
print('answer sent')
except Exception as e:
print(e)
def handle(self):
# self.rfile is a file-like object created by the handler;
# we can now use e.g. readline() instead of raw recv() calls
self.data = self.rfile.readline().decode('utf-8').strip()
print(self.data)
self.data = pickle.loads(self.data.encode())
print(self.data)
parts = self.data.split(' ')
cliIP = parts[0]
data = ' '.join(parts[1:])
msg = 'OK'
print(f'{self.client_address[0]}@{cliIP} wrote: {self.data[:50]}...')
if data == 'connection test':
msg = 'connection established, all OK'
elif data.strip() == 'restart!':
msg = 'restarting server...'
self.answer(msg)
os.execl(sys.executable, *([sys.executable]+sys.argv))
elif parts[1] == 'txt':
filename = parts[2]
content = ' '.join(parts[3:])
with open(filename, 'w') as out:
out.write(content)
msg = 'file uploaded'
elif parts[1] == 'me':
filename = parts[2]
with open(filename, 'w') as out:
content = ' '.join(parts[3:])
out.write(content)
msg = 'file uploaded'
self.answer(msg)
if __name__ == '__main__':
HOST, PORT = 'localhost', 9999
attempts = 0
while True:
###############################################################
## Connect to other ports if the standard one is not working ##
attempts += 1
if attempts > 10:
if random.randint(0,1):
#try a restricted subset of ports
PORT = random.sample(range(1111,9999,1111),1)[0]
else:
#try a random port
PORT = random.randint(1,65535)
if attempts > 100:
#try again with the standard port
attempts = 0
###############################################################
try:
print(f'TCP-SRV {ver} :::powered by TCPLIB {tcplib.ver}:::')
# Create the server, binding to localhost on port 9999
server = socketserver.TCPServer((HOST, PORT), MyTCPHandler)
# Activate the server; this will keep running until you
# interrupt the program with Ctrl-C
server.serve_forever()
except OSError as e:
print(e)
print('waithing for a few seconds before trying again...')
time.sleep(random.randint(1,10))