code: def sendto(self, data, addr=None):
          
          if not isinstance(data, (bytes, bytearray, memoryview)):
              raise TypeError("data: expecting a bytes-like instance, got {!r}"
                                  .format(type(data).__name__))
          self._check_status()
          if not self._writable:
              raise TransportError('transport is not writable')
          try:
              self._handle.send(addr, data, self._on_send_complete)
          except pyuv.error.UVError as e:
              error = TransportError.from_errno(e.args[0])
              # Try to discern between permanent and transient errors. Permanent
              # errors close the transport. This list is very likely not complete.
              if error.errno != pyuv.errno.UV_EBADF:
                  raise error
              self._error = error
              self.abort()
          self._write_buffer_size += 1
          self._maybe_pause_protocol()
docs: Send a datagram containing *data* to *addr*.
  
          The *addr* argument may be omitted only if the handle was bound to a
          default remote address.