def __init__(self, data=None, ip: str = None, port: int = 0, family: int = 0, factor: Data = None): if data is None: assert ip is not None and port is not 0, 'IP:port error: (%s:%d' % ( ip, port) if family is 0: family = self.family_ipv4 if family == self.family_ipv4: # IPv4 address = self.data_from_ipv4(ip=ip) else: # IPv6? address = None assert address is not None, 'failed to convert IP: %s, %d' % ( ip, family) data = MutableData(capacity=8) data.append(0) data.append(family) data.append(UInt16Data(value=port)) data.append(address) assert factor is not None, 'xor factor empty' data = self.xor(data=data, factor=factor) super().__init__(data=data, ip=ip, port=port, family=family)
def __init__(self, data=None, ip: str = None, port: int = 0, family: int = 0): if data is None: assert ip is not None and port is not 0, 'IP:port error: (%s:%d' % ( ip, port) if family is 0: family = self.family_ipv4 if family == self.family_ipv4: # IPv4 address = self.data_from_ipv4(ip=ip) else: # IPv6? address = None assert address is not None, 'failed to convert IP: %s, %d' % ( ip, family) data = MutableData(capacity=8) data.append(0) data.append(family) data.append(UInt16Data(value=port)) data.append(address) elif isinstance(data, MappedAddressValue): ip = data.ip port = data.port family = data.family super().__init__(data=data) self.__family = family self.__port = port self.__ip = ip
def data_from_ipv4(cls, ip: str) -> Data: # IPv4 array = ip.split('.') assert len(array) == 4, 'IPv4 address error: %s' % ip data = MutableData(capacity=4) for i in range(4): data.append(int(array[i])) return data
def _respond(self, head: Header, remote_ip: str, remote_port: int, local_port: int) -> bool: # local (server) address assert self.source_address is not None, 'source address not set' local_ip = self.source_address[0] assert local_port > 0, 'local port error' # changed (another) address assert self.changed_address is not None, 'changed address not set' changed_ip = self.changed_address[0] changed_port = self.changed_address[1] # create attributes value = MappedAddressValue(ip=remote_ip, port=remote_port) data1 = Attribute(tag=MappedAddress, value=value) # Xor value = XorMappedAddressValue(ip=remote_ip, port=remote_port, factor=head.trans_id) data4 = Attribute(tag=XorMappedAddress, value=value) # Xor2 value = XorMappedAddressValue2(ip=remote_ip, port=remote_port, factor=head.trans_id) data5 = Attribute(tag=XorMappedAddress2, value=value) # source address value = SourceAddressValue(ip=local_ip, port=local_port) data2 = Attribute(tag=SourceAddress, value=value) # changed address value = ChangedAddressValue(ip=changed_ip, port=changed_port) data3 = Attribute(tag=ChangedAddress, value=value) # software value = SoftwareValue(description=self.software) data6 = Attribute(tag=Software, value=value) # pack length = data1.length + data2.length + data3.length + data4.length + data5.length + data6.length body = MutableData(capacity=length) body.append(data1) body.append(data2) body.append(data3) body.append(data4) body.append(data5) body.append(data6) pack = Package.new(msg_type=BindResponse, trans_id=head.trans_id, body=body) res = self.send(data=pack, destination=(remote_ip, remote_port), source=(local_ip, local_port)) return res == pack.length
def __init__(self, description: str, data: Data = None): if data is None: data = description.encode('utf-8') length = len(data) tail = length & 3 if tail > 0: length += 4 - tail mutable = MutableData(capacity=length) mutable.copy(index=0, source=data) if tail > 0: # set '\0' to fill the tail spaces length -= 1 mutable.set_byte(index=length, value=0) data = mutable super().__init__(data=data) self.__desc = description
def __init__(self, data=None, msg_type: MessageType = None, msg_length: MessageLength = None, trans_id: TransactionID = None): if data is None: if trans_id is None: trans_id = TransactionID.generate() length = msg_type.length + msg_length.length + trans_id.length data = MutableData(capacity=length) data.append(msg_type) data.append(msg_length) data.append(trans_id) elif isinstance(data, Header): if msg_type is None: msg_type = data.type if msg_length is None: msg_length = data.msg_length if trans_id is None: trans_id = data.trans_id super().__init__(data=data) self.__type = msg_type self.__msg_length = msg_length self.__trans_id = trans_id