code: def _message_address_parse(self, message, invert_hello=False):
  		
  		message_header = self.hello_message(invert_hello=invert_hello)
  
  		if message[:len(message_header)] != message_header:
  			raise ValueError('Invalid message header')
  
  		message = message[len(message_header):]
  		message_parts = message.split(WBeaconGouverneurMessenger.__message_splitter__)
  
  		address = None
  		port = None
  
  		if len(message_parts) > 3:
  			raise ValueError('Invalid message. Too many separators')
  		elif len(message_parts) == 3:
  			address = WIPV4SocketInfo.parse_address(message_parts[1].decode('ascii'))
  			port = WIPPort(int(message_parts[2]))
  		elif len(message_parts) == 2 and len(message_parts[1]) > 0:
  			address = WIPV4SocketInfo.parse_address(message_parts[1].decode('ascii'))
  
  		return WIPV4SocketInfo(address, port)
docs: Read address from beacon message. If no address is specified then "nullable" WIPV4SocketInfo returns
  
  		:param message: message to parse
  		:param invert_hello: defines whether message header is the original one or reversed.
  		:return: WIPV4SocketInfo