Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- import socket
- import threading
- import time
- mode = 0
- timer_mult = 1.0
- fakebuffer_server = [bytearray([0x4d, 0x03, 0xff, 0x7f, 0x80, 0x04, 0x31, 0xa4]),
- bytearray([0x4d, 0x03, 0x00, 0x84, 0x80, 0x04, 0x31, 0xa4]), #431a4
- bytearray([0x4d, 0x03, 0x00, 0x88, 0x80, 0x04, 0x31, 0xa4]),
- bytearray([0x4d, 0x03, 0x00, 0x90, 0x80, 0x04, 0x31, 0xa4]),
- bytearray([0x4d, 0x03, 0x00, 0x94, 0x80, 0x04, 0x31, 0xa4]),
- bytearray([0x4d, 0x03, 0x00, 0x98, 0x80, 0x04, 0x31, 0xa4]),
- bytearray([0x4d, 0x03, 0x00, 0x9c, 0x80, 0x04, 0x31, 0xa4]),
- bytearray([0x4d, 0x03, 0xff, 0x7f, 0x80, 0x04, 0x31, 0xa4]),
- bytearray([0x4d, 0x03, 0xbc, 0x9a, 0x80, 0x04, 0x31, 0xa4]),
- ]
- fakebuffer_client = [bytearray([0x4d, 0x43, 0xff, 0x5f]),
- bytearray([0x4d, 0x43, 0x00, 0x84]),
- bytearray([0x4d, 0x43, 0x00, 0x88]),
- bytearray([0x4d, 0x43, 0x00, 0x90]),
- bytearray([0x4d, 0x43, 0x00, 0x94]),
- bytearray([0x4d, 0x43, 0x00, 0x98]),
- bytearray([0x4d, 0x43, 0x00, 0x9c]),
- bytearray([0x4d, 0x43, 0xff, 0x7f]),
- bytearray([0x4d, 0x43, 0xbc, 0x9a]),
- ]
- buffer_server = bytearray()
- buffer_client = bytearray()
- def keepalive_server(server, client):
- global buffer_client
- global buffer_server
- global mode
- keepalive = True
- if len(buffer_client) == 0:
- try:
- server.send(fakebuffer_client[mode])
- server.send(fakebuffer_client[mode])
- except: keepalive = False
- else:
- #print([hex(i) for i in buffer_client])
- try: server.send(buffer_client[:4])
- except: keepalive = False
- buffer_client = buffer_client[4:]
- if len(buffer_server) != 0:
- try: client.send(buffer_server)
- except: keepalive = False
- buffer_server = bytearray()
- if mode == 7: time = 0.01
- else: time = 0.05
- if keepalive: threading.Timer(time, keepalive_server, [server, client]).start()
- def keepalive_client(server, client):
- global buffer_client
- global buffer_server
- global mode
- keepalive = True
- if len(buffer_server) == 0:
- try: client.send(fakebuffer_server[mode])
- except: keepalive = False
- else:
- #print([hex(i) for i in buffer_server])
- try: client.send(buffer_server[:8])
- except: keepalive = False
- buffer_server = buffer_server[8:]
- if len(buffer_client) != 0:
- try: server.send(buffer_client)
- except: keepalive = False
- buffer_client = bytearray()
- if mode == 7: time = 0.01
- else: time = 0.025
- if keepalive: threading.Timer(time * timer_mult, keepalive_client, [server, client]).start()
- def listen_server(server, client):
- global buffer_server
- global mode
- global host
- global timer_mult
- lastbyte = 0
- try:
- while True:
- sbuffer = server.recv(8)
- if host:
- last_mode = mode
- if sbuffer[3] == 0x84: mode = 1
- elif sbuffer[3] == 0x88: mode = 2
- elif sbuffer[3] == 0x90: mode = 3
- elif sbuffer[3] == 0x94: mode = 4
- elif sbuffer[3] == 0x98: mode = 5
- elif sbuffer[3] == 0x9c: mode = 6
- elif sbuffer[3] == 0x7f or sbuffer[3] == 0x4f: mode = 7
- elif sbuffer[3] == 0x9a and sbuffer[2] == 0xbc: mode = 7
- elif sbuffer[3] == 0x5f: pass
- else: mode = 7
- if last_mode != mode: print("Mode changed to " + str(mode))
- if mode != 7:
- if sbuffer[2] != lastbyte:
- lastbyte = sbuffer[2]
- if not host: sbuffer += sbuffer + sbuffer + sbuffer + sbuffer + sbuffer + sbuffer + sbuffer
- buffer_server += sbuffer
- #print([hex(i) for i in buffer_server])
- else:
- if sbuffer[3] == 0x4f:
- sbuffer += (server.recv(8))
- datalength = (int)(sbuffer[10])
- sbuffer2 = bytearray()
- while len(sbuffer2) < 8 * (datalength + 2):
- sbuffer2 += (server.recv(8 * (datalength + 2) - len(sbuffer2)))
- buffer_server += sbuffer + sbuffer2
- #print([hex(i) for i in buffer_server])
- except:
- print("P1 has disconnected.")
- def listen_client(server, client):
- global buffer_client
- global mode
- global host
- global timer_mult
- first = False
- lastbyte = 0
- try:
- while True:
- sbuffer = client.recv(4)
- #print([hex(i) for i in sbuffer])
- if not host:
- last_mode = mode
- if sbuffer[3] == 0x84: mode = 1
- elif sbuffer[3] == 0x88: mode = 2
- elif sbuffer[3] == 0x90: mode = 3
- elif sbuffer[3] == 0x94: mode = 4
- elif sbuffer[3] == 0x98: mode = 5
- elif sbuffer[3] == 0x9c: mode = 6
- elif sbuffer[3] == 0x7f or sbuffer[3] == 0x4f: mode = 7
- elif sbuffer[3] == 0x9a and sbuffer[2] == 0xbc: mode = 8
- elif sbuffer[3] == 0x5f: pass
- else: mode = 7
- if last_mode != mode: print("Mode changed to " + str(mode))
- if mode != 7 and mode != 8:
- if sbuffer[2] != lastbyte:
- lastbyte = sbuffer[2]
- if host: sbuffer += sbuffer + sbuffer + sbuffer + sbuffer + sbuffer + sbuffer + sbuffer
- success = False
- while not success:
- try:
- buffer_client += sbuffer
- success = True
- except:
- pass
- else:
- #print([hex(i) for i in sbuffer])
- if sbuffer[3] == 0x4f:
- timer_mult *= 2
- sbuffer += (client.recv(4))
- datalength = (int)(sbuffer[6])
- sbuffer2 = bytearray()
- while len(sbuffer2) < 4 * (datalength + 2):
- sbuffer2 += (client.recv(4 * (datalength + 2) - len(sbuffer2)))
- buffer_client += sbuffer + sbuffer2
- timer_mult /= 2
- elif sbuffer[3] == 0x9a and sbuffer[2] == 0xbc:
- success = False
- while not success:
- try:
- buffer_client += sbuffer
- success = True
- except:
- pass
- if sbuffer[3] == 0xff or sbuffer[3] == 0x5f:
- timer_mult += 0.1
- while client.recv(4)[3] == 0xff: timer_mult += 0.002
- else:
- timer_mult -= 0.002
- if timer_mult < 1.0: timer_mult = 1.0
- except:
- print("P2 has disconnected.")
- server_address = input("Enter the host IP, or leave blank if you are hosting: ")
- if server_address == "": host = True
- else: host = False
- sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
- sock.bind(('', 6478))
- sock.listen(4)
- if host:
- print("Waiting for your local client...")
- client0, address0 = sock.accept()
- print("Waiting for P2...")
- client1, address1 = sock.accept()
- client0.send(bytes([0x00, 0x00, 0x00, 0x00]))
- client1.send(bytes([0x01, 0x00, 0x00, 0x00]))
- print("Ready.")
- threading.Thread(target = listen_server, args = (client0,client1)).start()
- threading.Thread(target = listen_client, args = (client0,client1)).start()
- keepalive_server(client0, client1)
- #keepalive_client(client0, client1)
- else:
- print("Waiting for your local client...")
- client1, address1 = sock.accept()
- print("Connecting to host...")
- client0 = socket.create_connection((server_address, 6478))
- client1.send(client0.recv(4))
- print("Ready.")
- threading.Thread(target = listen_server, args = (client0,client1)).start()
- threading.Thread(target = listen_client, args = (client0,client1)).start()
- keepalive_client(client0, client1)
Add Comment
Please, Sign In to add comment