def connect(self, addr: tuple): """ addr: <ip, port> """ # precondition if not self.bound: self.bind(('',)) self.connected = False payload = dict( action="connect", data=addr ) self.interface.sendall(VM_Message(payload).pack()) resp = VM.read_message(self.interface).payload if resp["status"] == 0: self.logger.debug("Connection established with {}:{}".format(*addr)) self.connected = True self.remote_addr = addr else: self.logger.error("Connection failed") raise RuntimeError("Connection failed with status code {}, {}". format(resp["status"], resp["message"]))
def active_bind(self, iface: str, port: int): b_context = (iface, port) payload = dict( action="is_bindable", data=b_context ) msg = VM_Message(payload) self.interface.sendall(msg.pack()) resp = VM.read_message(self.interface).payload if resp["status"] == 0: payload = dict( action="bind", data=b_context ) msg = VM_Message(payload) self.interface.send(msg.pack()) resp = VM.read_message(self.interface).payload if resp["status"] != 0: self.logger.error("Socket is bindable but bind failed") raise Exception(resp["message"]) else: self.logger.debug("Socket is not bindable") raise ValueError("Not bindable") self.logger.debug("Socket bound on {}:{}".format(iface, port))
def accept(self) -> 'RUDPSocket': if not self.bound or self.listen == 0: raise RuntimeError("Socket is not bound or not listening") payload = dict( action="accept", data=() ) self.interface.sendall(VM_Message(payload).pack()) resp = VM.read_message(self.interface).payload if resp["status"] == 0: self.logger.debug("New socket spawned") sock = copy.copy(self) sock.remote_addr = tuple(resp["data"]) return sock else: raise RuntimeError("Unknown error on accept")
def listen(self, n: int): # precondition assert self.bound == True assert self.port > 0 self.n_listen = n payload = dict( action="listen", data=(n,) ) msg = VM_Message(payload) self.interface.sendall(msg.pack()) resp = VM.read_message(self.interface).payload if resp["status"] != 0: self.logger.error("Unknown error on listen") raise RuntimeError("Unknown error on listen")
def send(self, payload: str) -> None: """ Works as sendall """ # precondition assert len(payload) > 0 if not self.connected: raise ConnectionError("Socket not connected") payload = dict( action="send", data=(payload,) ) self.interface.sendall(VM_Message(payload).pack()) resp = VM.read_message(self.interface).payload if resp["status"] != 0: raise RuntimeError(resp["message"])
def recv(self, buff_size: int) -> str: # precondition assert buff_size > 0 if not self.connected: raise ConnectionError("Socket not connected") payload = dict( action="recv", data=(buff_size,) ) self.interface.sendall(VM_Message(payload).pack()) resp = VM.read_message(self.interface).payload if resp["status"] != 0: raise RuntimeError(resp["message"]) else: data, = resp["data"] return data