Exemplo n.º 1
0
    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"]))
Exemplo n.º 2
0
 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))
Exemplo n.º 3
0
 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")
Exemplo n.º 4
0
    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")
Exemplo n.º 5
0
    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"])
Exemplo n.º 6
0
    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