-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathtcp_fakeclient.py
72 lines (62 loc) · 2.64 KB
/
tcp_fakeclient.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
# Connect to a known game Server and spew out whatever it tells us, before the missing heartbeat causes us to disco
#
import socket
import struct
import sys
import json
# internet variables
game_address = ('127.0.0.1', 27001) # a hack so that I can use the tcpserver when testing.
######
# misc helper function declarations
######
# build a byte string for tx on the wire
def msg_builder(msg_type=0,contents=''):
return struct.pack('<LB', len(contents),msg_type)+contents
# generator f'n to take an arbitrary string and pump it through, one byte at a time
def byte_pump(byte_string):
for byte in byte_string:
yield byte
######
# Main block starts here
# the client connected, so make a connection to the server now
try:
print >>sys.stderr, 'CLIENT : connecting to %s port %s...' % game_address
game_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
game_socket.connect(game_address)
isRunning=True
while isRunning:
message = game_socket.recv(5)
if message:
(msg_len,code) = struct.unpack('<LB', message)
if msg_len > 0:
payload = game_socket.recv(msg_len)
print >>sys.stderr, 'CLIENT : recd %d bytes payload with code %r' % (msg_len, code)
else:
payload = False
if code==0:
#no-op for heartbeat
if payload:
print >>sys.stderr, 'WARNING, NONZERO PAYLOAD OF %d BYTES IN HEARTBEAT MESSAGE.\n ABORTING RUN AND DUMPING PAYLOAD:\n%u' % \
(msg_len, payload)
isRunning=False
break
elif code == 1:
data=json.loads(payload)
print >>sys.stderr, 'CLIENT : app version: %s lang: %s ' % (data['version'],data['lang'])
elif code == 3:
print >>sys.stderr, 'CLIENT : gamestate update, %d bytes' % len(payload)
elif code == 5:
data=json.loads(payload)
print >>sys.stderr, 'CLIENT : unknown JSON state message. Dumping:\n%s\n\n' % \
json.dumps(data, sort_keys=True, indent=4, separators=(',', ': '))
else:
print >>sys.stderr, 'CLIENT : unknown code "%d", payload of %d bytes ' % (code,len(payload))
# reply with an empty heartbeat
game_socket.sendall(msg_builder())
else:
print >>sys.stderr, 'CLIENT : error from socket'
isRunning = False
finally:
# close out the connections
print >>sys.stderr, 'CLIENT : closing socket'
game_socket.close()