@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()); }
/** 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(); } }