Beispiel #1
0
  @Override
  public void encode(UdpPacket packet, ByteBuffer buffer) {
    buffer.putInt(packet.protocol().id());

    buffer.putInt(packet.ack());
    buffer.putInt(packet.ackBitField());

    switch (packet.protocol()) {
      case Unreliable:
        break;
      case UnreliableSequenced:
        buffer.putInt(packet.sequence());
        break;
      case ReliableUnordered:
      case ReliableSequenced:
      case ReliableOrdered:
        buffer.putInt(packet.sequence());
        buffer.putLong(packet.timestamp());
        break;
      default:
        throw new UdpPacketException("Invalid protocol");
    }

    buffer.putInt(packet.dataLength());
    buffer.put(packet.data());
  }
Beispiel #2
0
  /** Redirect packets from source addr/port to destination addr/port */
  public void run() {
    try {
      byte[] buf = new byte[2000];

      socket.setSoTimeout(socket_to);
      while (!stop) {
        UdpPacket packet = new UdpPacket(buf, buf.length);

        // non-blocking receiver
        try {
          socket.receive(packet);
        } catch (InterruptedIOException ie) {
          continue;
        }

        SocketAddress pkt_soaddr = new SocketAddress(packet.getIpAddress(), packet.getPort());
        if (src_soaddr == null
            || !src_soaddr.equals(
                pkt_soaddr)) { // System.out.println("DEBUG: src address "+src_soaddr+" changed to
                               // "+pkt_soaddr);
          src_soaddr = pkt_soaddr;
          if (listener != null) listener.onUdpMultiRelaySourceAddressChanged(this, src_soaddr);
        }

        for (int i = 0; i < dest_sockets.size(); i++) {
          try {
            UdpConnectedSocket dest_socket = (UdpConnectedSocket) dest_sockets.elementAt(i);
            if (!filtered || !dest_socket.equals(socket)) {
              if (one2one) dest_socket.send(packet);
              else socket.sendTo(packet, dest_socket.getRemoteAddress());
              // System.out.print("*");
            }
            // else System.out.print(".");
          } catch (ArrayIndexOutOfBoundsException e) {
          }
        }
      }
      // socket.close();
      if (listener != null) listener.onUdpMultiRelayTerminated(this);
    } catch (Exception e) {
      e.printStackTrace();
    }
  }