// send a packet
  public int send(DatagramPacket p, Client sender, EmuSocket socket) {
    boolean sentSomething = false;

    Client receiver = getReceiver(sender);

    if (receiver == null) throw new RuntimeException("ERROR: send() called on wrong link");

    Vector receiverSockets = receiver.getSockets();

    if (!this.isNextPacketDeliverable()) {
      return Link.PACKET_LOST;
    }

    for (Iterator iter = receiverSockets.iterator(); iter.hasNext(); ) {
      EmuSocket curSocket = (EmuSocket) iter.next();

      if (curSocket.getGroups().contains(p.getAddress())) {
        // send the packet to the socket
        curSocket.receivePacket(p, this.getDelay());
        sentSomething = true;
      }
    }

    if (sentSomething) {
      if (Options.flashTime != 0) {
        // adjust color of arrow (-> flashing)
        if (receiver == this.start) {
          // change the color of the link
          if (flashThreadStart == null || !flashThreadStart.isAlive()) {
            flashThreadStart = new FlashLinkThread(true);
            flashThreadStart.start();
          } else {
            flashThreadStart.reset();
          }
        } else {
          // change the color of the link
          if (flashThreadEnd == null || !flashThreadEnd.isAlive()) {
            flashThreadEnd = new FlashLinkThread(false);
            flashThreadEnd.start();
          } else {
            flashThreadEnd.reset();
          }
        }
      }

      return Link.PACKET_SENT;
    } else {
      return Link.NO_GROUP_MEMBER;
    }
  }