diff options
Diffstat (limited to '')
-rw-r--r-- | python_client.py | 91 |
1 files changed, 84 insertions, 7 deletions
diff --git a/python_client.py b/python_client.py index 561a1c3..21f4c55 100644 --- a/python_client.py +++ b/python_client.py @@ -1,23 +1,100 @@ -import socket, ssl, threading +import socket, ssl, threading, struct basesock = socket.socket(socket.AF_INET, socket.SOCK_STREAM, 0) basesock.connect(('localhost', 5454)) -sock = ssl.wrap_socket(basesock) +#sock = ssl.wrap_socket(basesock) +sock = basesock + +nextID = 1 +lastReceivedPacketID = 0 +packetCache = [] +packetLock = threading.Lock() + +class Packet: + def __init__(self, type, data): + global nextID + + self.type = type + self.data = data + if (type & 0x8000) == 0: + self.id = nextID + nextID = nextID + 1 + + def sendOverWire(self): + header = struct.pack('<HHI', self.type, 0, len(self.data)) + if (self.type & 0x8000) == 0: + extHeader = struct.pack('<II', self.id, lastReceivedPacketID) + else: + extHeader = b'' + + sock.sendall(header) + if extHeader: + sock.sendall(extHeader) + sock.sendall(self.data) + + +def clearCachedPackets(pid): + for packet in packetCache[:]: + if packet.id <= pid: + packetCache.remove(packet) def reader(): + global lastReceivedPacketID + readbuf = b'' + print('(Connected)') while True: - data = sock.read() - if data: - print(data) - else: + data = sock.recv(1024) + if not data: print('(Disconnected)') break + readbuf += data + + pos = 0 + bufsize = len(readbuf) + while True: + if (pos + 8) > bufsize: + break + + type, reserved, size = struct.unpack_from('<HHI', readbuf, pos) + pos += 8 + + extHeaderSize = 8 if ((type & 0x8000) == 0) else 0 + if (pos + extHeaderSize + size) > bufsize: + break + + if ((type & 0x8000) == 0): + pid, lastReceivedByServer = struct.unpack_from('<II', readbuf, pos) + pos += 8 + + with packetLock: + lastReceivedPacketID = pid + clearCachedPackets(lastReceivedByServer) + + packetdata = data[pos:pos+size] + print('0x%x : %d bytes : %s' % (type, size, packetdata)) + pos += size + +def writePacket(type, data): + with packetLock: + packet = Packet(type, data) + if (type & 0x8000) != 0: + packetCache.append(packet) + packet.sendOverWire() + + thd = threading.Thread(None, reader) thd.start() while True: bit = input() - sock.write((bit + '\n').encode('utf-8')) + bits = bit.split(' ', 1) + cmd = bits[0] + + if cmd == 'login': + writePacket(0x8001, struct.pack('<II 16s', 0, 0, b'\0'*16)) + elif cmd == 'cmd': + data = bits[1].encode('utf-8') + writePacket(1, struct.pack('<I', len(data)) + data) |