mirror of
https://github.com/barronwaffles/dwc_network_server_emulator.git
synced 2026-07-15 15:40:52 -05:00
Trying to make natneg more stable
This commit is contained in:
parent
f661e8d434
commit
2a85dff62f
|
|
@ -397,12 +397,25 @@ class GameSpyBackendServer(object):
|
|||
|
||||
return None
|
||||
|
||||
def find_server_by_local_address(self, publicip, localip, localport, gameid = None):
|
||||
def find_server_by_local_address(self, publicip, localaddr, gameid = None):
|
||||
localip = localaddr[0]
|
||||
localport = localaddr[1]
|
||||
localip_int_le = localaddr[2]
|
||||
localip_int_be = localaddr[3]
|
||||
|
||||
if gameid == None:
|
||||
# Search all servers
|
||||
for gameid in self.server_list:
|
||||
for server in self.server_list[gameid]:
|
||||
logger.log(logging.DEBUG, "publicip: %s == %s ? %d" % (server['publicip'], publicip, server['publicip'] == publicip))
|
||||
logger.log(logging.DEBUG, "publicip 1: %s == %s ? %d port: %s == %s ? %d" % (server['publicip'], str(localip_int_le), server['publicip'] == str(localip_int_le), server['publicport'], str(localport), server['publicport'] == str(localport)))
|
||||
if server['publicip'] == str(localip_int_le) and server['publicport'] == str(localport):
|
||||
return server
|
||||
|
||||
logger.log(logging.DEBUG, "publicip 2: %s == %s ? %d port: %s == %s ? %d" % (server['publicip'], str(localip_int_be), server['publicip'] == str(localip_int_be), server['publicport'], str(localport), server['publicport'] == str(localport)))
|
||||
if server['publicip'] == str(localip_int_be) and server['publicport'] == str(localport):
|
||||
return server
|
||||
|
||||
logger.log(logging.DEBUG, "publicip 3: %s == %s ? %d" % (server['publicip'], publicip, server['publicip'] == publicip))
|
||||
if server['publicip'] == publicip and (server['localport'] == str(localport) or server['publicport'] == str(localport)):
|
||||
for x in range(0, 10):
|
||||
s = 'localip%d' % x
|
||||
|
|
@ -411,6 +424,14 @@ class GameSpyBackendServer(object):
|
|||
return server
|
||||
else:
|
||||
for server in self.server_list[gameid]:
|
||||
logger.log(logging.DEBUG, "publicip 1: %s == %s ? %d port: %s == %s ? %d" % (server['publicip'], str(localip_int_le), server['publicip'] == str(localip_int_le), server['publicport'], str(localport), server['publicport'] == str(localport)))
|
||||
if server['publicip'] == str(localip_int_le) and server['publicport'] == str(localport):
|
||||
return server
|
||||
|
||||
logger.log(logging.DEBUG, "publicip 2: %s == %s ? %d port: %s == %s ? %d" % (server['publicip'], str(localip_int_be), server['publicip'] == str(localip_int_be), server['publicport'], str(localport), server['publicport'] == str(localport)))
|
||||
if server['publicip'] == str(localip_int_be) and server['publicport'] == str(localport):
|
||||
return server
|
||||
|
||||
logger.log(logging.DEBUG, "publicip: %s == %s ? %d" % (server['publicip'], publicip, server['publicip'] == publicip))
|
||||
if server['publicip'] == publicip and (server['localport'] == str(localport) or server['publicport'] == str(localport)):
|
||||
for x in range(0, 10):
|
||||
|
|
|
|||
|
|
@ -75,10 +75,12 @@ class GameSpyNatNegServer(object):
|
|||
client_id = "%02x" % ord(recv_data[13])
|
||||
|
||||
localip_raw = recv_data[15:19]
|
||||
localip_int_le = utils.get_int(recv_data, 15)
|
||||
localip_int_be = utils.get_int_be(recv_data, 15)
|
||||
localip = '.'.join(["%d" % ord(x) for x in localip_raw])
|
||||
localport_raw = recv_data[19:21]
|
||||
localport = utils.get_short_be(localport_raw, 0)
|
||||
localaddr = (localip, localport)
|
||||
localaddr = (localip, localport, localip_int_le, localip_int_be)
|
||||
|
||||
if gameid not in self.session_list:
|
||||
self.session_list[gameid] = {}
|
||||
|
|
@ -99,6 +101,9 @@ class GameSpyNatNegServer(object):
|
|||
|
||||
#if self.session_list[gameid][session_id][client]['serveraddr'] == None:
|
||||
serveraddr = self.get_server_info(gameid, session_id, client)
|
||||
if serveraddr == None:
|
||||
serveraddr = self.get_server_info_alt(gameid, session_id, client)
|
||||
|
||||
self.session_list[gameid][session_id][client]['serveraddr'] = serveraddr
|
||||
logger.log(logging.DEBUG, "Found server from local ip/port: %s from %d" % (serveraddr, session_id))
|
||||
|
||||
|
|
@ -125,6 +130,9 @@ class GameSpyNatNegServer(object):
|
|||
# Send to other client
|
||||
#if self.session_list[gameid][session_id][client_id]['serveraddr'] == None:
|
||||
serveraddr = self.get_server_info(gameid, session_id, client_id)
|
||||
if serveraddr == None:
|
||||
serveraddr = self.get_server_info_alt(gameid, session_id, client)
|
||||
|
||||
self.session_list[gameid][session_id][client_id]['serveraddr'] = serveraddr
|
||||
logger.log(logging.DEBUG, "Found server 2 from local ip/port: %s from %d" % (serveraddr, session_id))
|
||||
|
||||
|
|
@ -175,6 +183,17 @@ class GameSpyNatNegServer(object):
|
|||
logger.log(logging.DEBUG, "Sent address check response to %s:%d..." % (self.session_list[gameid][session_id][client]['addr'][0], self.session_list[gameid][session_id][client]['addr'][1]))
|
||||
logger.log(logging.DEBUG, utils.pretty_print_hex(output))
|
||||
|
||||
elif recv_data[7] == '\x0c': # Natify
|
||||
port_type = "%02x" % ord(recv_data[12])
|
||||
logger.log(logging.DEBUG, "Received natify command from %s:%s..." % (addr[0], addr[1]))
|
||||
|
||||
output = bytearray(recv_data)
|
||||
output[7] = 0x02 # ERT Test
|
||||
s.sendto(output, addr)
|
||||
|
||||
logger.log(logging.DEBUG, "Sent natify response to %s:%d..." % (self.session_list[gameid][session_id][client]['addr'][0], self.session_list[gameid][session_id][client]['addr'][1]))
|
||||
logger.log(logging.DEBUG, utils.pretty_print_hex(output))
|
||||
|
||||
elif recv_data[7] == '\x0d':
|
||||
client_id = "%02x" % ord(recv_data[13])
|
||||
logger.log(logging.DEBUG, "Received report command from %s:%s..." % (addr[0], addr[1]))
|
||||
|
|
@ -222,29 +241,30 @@ class GameSpyNatNegServer(object):
|
|||
|
||||
return server_info
|
||||
|
||||
# console = 0
|
||||
# ipstr = self.session_list[gameid][session_id][client_id]['addr'][0]
|
||||
#
|
||||
# if console != 0:
|
||||
# ip = str(ctypes.c_int32(utils.get_int_be(bytearray([int(x) for x in ipstr.split('.')]), 0)).value) # Wii
|
||||
# console = 0
|
||||
# else:
|
||||
# ip = str(ctypes.c_int32(utils.get_int(bytearray([int(x) for x in ipstr.split('.')]), 0)).value) # DS
|
||||
# console = 1
|
||||
#
|
||||
# serveraddr = self.server_manager.find_server_by_local_address(ip, self.session_list[gameid][session_id][client_id]['localaddr'][0], self.session_list[gameid][session_id][client_id]['localaddr'][1], self.session_list[gameid][session_id][client_id]['gameid'])._getvalue()
|
||||
#
|
||||
# if serveraddr == None:
|
||||
# if console != 0:
|
||||
# ip = str(ctypes.c_int32(utils.get_int_be(bytearray([int(x) for x in ipstr.split('.')]), 0)).value) # Wii
|
||||
# console = 0
|
||||
# else:
|
||||
# ip = str(ctypes.c_int32(utils.get_int(bytearray([int(x) for x in ipstr.split('.')]), 0)).value) # DS
|
||||
# console = 1
|
||||
#
|
||||
# serveraddr = self.server_manager.find_server_by_local_address(ip, self.session_list[gameid][session_id][client_id]['localaddr'][0], self.session_list[gameid][session_id][client_id]['localaddr'][1], self.session_list[gameid][session_id][client_id]['gameid'])._getvalue()
|
||||
#
|
||||
# return serveraddr
|
||||
def get_server_info_alt(self, gameid, session_id, client_id):
|
||||
console = 0
|
||||
ipstr = self.session_list[gameid][session_id][client_id]['addr'][0]
|
||||
|
||||
if console != 0:
|
||||
ip = str(ctypes.c_int32(utils.get_int_be(bytearray([int(x) for x in ipstr.split('.')]), 0)).value) # Wii
|
||||
console = 0
|
||||
else:
|
||||
ip = str(ctypes.c_int32(utils.get_int(bytearray([int(x) for x in ipstr.split('.')]), 0)).value) # DS
|
||||
console = 1
|
||||
|
||||
serveraddr = self.server_manager.find_server_by_local_address(ip, self.session_list[gameid][session_id][client_id]['localaddr'], self.session_list[gameid][session_id][client_id]['gameid'])._getvalue()
|
||||
|
||||
if serveraddr == None:
|
||||
if console != 0:
|
||||
ip = str(ctypes.c_int32(utils.get_int_be(bytearray([int(x) for x in ipstr.split('.')]), 0)).value) # Wii
|
||||
console = 0
|
||||
else:
|
||||
ip = str(ctypes.c_int32(utils.get_int(bytearray([int(x) for x in ipstr.split('.')]), 0)).value) # DS
|
||||
console = 1
|
||||
|
||||
serveraddr = self.server_manager.find_server_by_local_address(ip, self.session_list[gameid][session_id][client_id]['localaddr'], self.session_list[gameid][session_id][client_id]['gameid'])._getvalue()
|
||||
|
||||
return serveraddr
|
||||
|
||||
if __name__ == "__main__":
|
||||
natneg_server = GameSpyNatNegServer()
|
||||
|
|
|
|||
|
|
@ -120,8 +120,9 @@ class PlayerSession(LineReceiver):
|
|||
|
||||
if self.session in self.sessions:
|
||||
del self.sessions[self.session]
|
||||
self.db.delete_session(self.session)
|
||||
self.log(logging.INFO, "Deleted session %d" % self.sessions)
|
||||
|
||||
self.db.delete_session(self.session)
|
||||
self.log(logging.INFO, "Deleted session " + self.session)
|
||||
|
||||
def rawDataReceived(self, data):
|
||||
self.log(logging.DEBUG, "RESPONSE: '%s'..." % data)
|
||||
|
|
@ -133,7 +134,8 @@ class PlayerSession(LineReceiver):
|
|||
commands, self.remaining_message = gs_query.parse_gamespy_message(data)
|
||||
|
||||
for data_parsed in commands:
|
||||
self.log(-1, data_parsed)
|
||||
#self.log(-1, data_parsed)
|
||||
self.log(logging.DEBUG, data_parsed)
|
||||
|
||||
if data_parsed['__cmd__'] == "login":
|
||||
self.perform_login(data_parsed)
|
||||
|
|
@ -273,9 +275,18 @@ class PlayerSession(LineReceiver):
|
|||
self.get_status_from_friends()
|
||||
self.send_status_to_friends()
|
||||
|
||||
profile = self.db.get_profile_from_profileid(profileid)
|
||||
if profile != None:
|
||||
self.statstring = profile['stat']
|
||||
self.locstring = profile['loc']
|
||||
|
||||
def perform_logout(self, data_parsed):
|
||||
self.log(logging.INFO, "Session %s has logged off" % (data_parsed['sesskey']))
|
||||
self.db.delete_session(data_parsed['sesskey'])
|
||||
|
||||
if self.session in self.sessions:
|
||||
del self.sessions[self.session]
|
||||
|
||||
self.transport.loseConnection()
|
||||
|
||||
def perform_getprofile(self, data_parsed):
|
||||
|
|
@ -345,16 +356,19 @@ class PlayerSession(LineReceiver):
|
|||
def perform_status(self, data_parsed):
|
||||
self.sesskey = data_parsed['sesskey']
|
||||
|
||||
#fields = []
|
||||
#fields.append(("stat", data_parsed['statstring']))
|
||||
#fields.append(("loc", data_parsed['locstring']))
|
||||
|
||||
#self.db.update_profile(sesskey, fields)
|
||||
|
||||
self.status = data_parsed['__cmd_val__']
|
||||
self.statstring = data_parsed['statstring']
|
||||
self.locstring = data_parsed['locstring']
|
||||
|
||||
fields = []
|
||||
#fields.append(("status", self.status))
|
||||
fields.append(("stat", self.statstring))
|
||||
fields.append(("loc", self.locstring))
|
||||
|
||||
for f in fields:
|
||||
self.db.update_profile(self.sesskey, f)
|
||||
|
||||
# Send authorization requests to client
|
||||
self.get_buddy_requests()
|
||||
|
||||
|
|
|
|||
|
|
@ -39,7 +39,6 @@ class GameSpyQRServer(object):
|
|||
self.gamename = ""
|
||||
self.keepalive = -1
|
||||
|
||||
self.own_server = None
|
||||
|
||||
def __init__(self):
|
||||
self.sessions = {}
|
||||
|
|
@ -268,7 +267,7 @@ class GameSpyQRServer(object):
|
|||
# dwc_mtype = 3 is used when looking for a friends only game (possibly other uses too).
|
||||
|
||||
# Some memory could be saved by clearing out any unwanted fields from k before sending.
|
||||
self.own_server = self.server_manager.update_server_list(k['gamename'], session_id, k, self.sessions[session_id].console)._getvalue()
|
||||
self.server_manager.update_server_list(k['gamename'], session_id, k, self.sessions[session_id].console)._getvalue()
|
||||
self.sessions[session_id].gamename = k['gamename']
|
||||
elif k['statechanged'] == "2": # Close server
|
||||
self.server_manager.delete_server(k['gamename'] , session_id)
|
||||
|
|
@ -326,6 +325,3 @@ class GameSpyQRServer(object):
|
|||
del self.sessions[session_id]
|
||||
|
||||
time.sleep(15.0)
|
||||
|
||||
def get_own_server(self):
|
||||
return self.own_server
|
||||
|
|
|
|||
|
|
@ -79,7 +79,7 @@ class Session(LineReceiver):
|
|||
self.setRawMode() # We're dealing with binary data so set to raw mode
|
||||
self.address = address
|
||||
self.forward_to_client = False
|
||||
self.forward_client = ()
|
||||
self.forward_client = None
|
||||
self.header_length = 0
|
||||
self.expected_packet_length = 0
|
||||
self.forward_packet = None
|
||||
|
|
@ -121,7 +121,7 @@ class Session(LineReceiver):
|
|||
self.forward_data_to_client(self.forward_packet, self.forward_client)
|
||||
|
||||
self.forward_to_client = False
|
||||
self.forward_client = ()
|
||||
self.forward_client = None
|
||||
self.header_length = 0
|
||||
self.expected_packet_length = 0
|
||||
self.forward_packet = None
|
||||
|
|
@ -217,7 +217,7 @@ class Session(LineReceiver):
|
|||
self.forward_data_to_client(data[3:], dest)
|
||||
|
||||
self.forward_to_client = False
|
||||
self.forward_client = ()
|
||||
self.forward_client = None
|
||||
self.header_length = 0
|
||||
self.expected_packet_length = 0
|
||||
self.forward_packet = None
|
||||
|
|
@ -402,14 +402,14 @@ class Session(LineReceiver):
|
|||
|
||||
if len(data) == 10 and bytearray(data)[0:6] == bytearray([0xfd, 0xfc, 0x1e, 0x66, 0x6a, 0xb2]):
|
||||
natneg_session = utils.get_int(data,6)
|
||||
self.log(logging.DEBUG, "Adding %d to natneg server list" % (natneg_session))
|
||||
self.log(logging.DEBUG, "Adding %d to natneg server list: %s" % (natneg_session, server))
|
||||
self.server_manager.add_natneg_server(natneg_session, server) # Store info in backend so we can get it later in natneg
|
||||
|
||||
if self.qr != None:
|
||||
own_server = self.qr.get_own_server()
|
||||
|
||||
self.log(logging.DEBUG, "Adding %d to natneg server list" % (natneg_session))
|
||||
self.server_manager.add_natneg_server(natneg_session, own_server) # Store info in backend so we can get it later in natneg
|
||||
# if self.qr != None:
|
||||
# own_server = self.qr.get_own_server()
|
||||
#
|
||||
# self.log(logging.DEBUG, "Adding %d to natneg server list: %s" % (natneg_session, own_server))
|
||||
# self.server_manager.add_natneg_server(natneg_session, own_server) # Store info in backend so we can get it later in natneg
|
||||
|
||||
output = bytearray([0xfe, 0xfd, 0x06])
|
||||
output += utils.get_bytes_from_int(server['__session__'])
|
||||
|
|
|
|||
Loading…
Reference in New Issue
Block a user