@Override public DatagramPacket encapsulate(DatagramPacket packet, SocketAddress destination) throws SocksException { if (destination instanceof InetSocketAddress) { InetSocketAddress destinationAddress = (InetSocketAddress) destination; final byte[] data = packet.getData(); final InetAddress remoteServerAddress = packet.getAddress(); final byte[] addressBytes = remoteServerAddress.getAddress(); final int ADDRESS_LENGTH = remoteServerAddress.getAddress().length; final int remoteServerPort = packet.getPort(); byte[] buffer = new byte[6 + packet.getLength() + ADDRESS_LENGTH]; buffer[0] = buffer[1] = 0; // reserved byte buffer[2] = 0; // fragment byte buffer[3] = (byte) (ADDRESS_LENGTH == 4 ? AddressType.IPV4 : AddressType.IPV6); System.arraycopy(addressBytes, 0, buffer, 4, ADDRESS_LENGTH); buffer[4 + ADDRESS_LENGTH] = SocksUtil.getFirstByteFromInt(remoteServerPort); buffer[5 + ADDRESS_LENGTH] = SocksUtil.getSecondByteFromInt(remoteServerPort); System.arraycopy(data, 0, buffer, 6 + ADDRESS_LENGTH, packet.getLength()); return new DatagramPacket(buffer, buffer.length, destinationAddress.getAddress(), destinationAddress.getPort()); } else { throw new IllegalArgumentException("Only support java.net.InetSocketAddress"); } }
@Override public DatagramPacket encapsulate(DatagramPacket packet, SocketAddress destination) throws SocksException { if (destination instanceof InetSocketAddress) { InetSocketAddress destinationAddress = (InetSocketAddress) destination; final byte[] data = packet.getData(); final InetAddress remoteServerAddress = packet.getAddress(); final byte[] addressBytes = remoteServerAddress.getAddress(); final int ADDRESS_LENGTH = remoteServerAddress.getAddress().length; final int remoteServerPort = packet.getPort(); byte[] buffer = new byte[6 + packet.getLength() + ADDRESS_LENGTH]; buffer[0] = buffer[1] = 0; // reserved byte buffer[2] = 0; // fragment byte buffer[3] = (byte) (ADDRESS_LENGTH == 4 ? AddressType.IPV4 : AddressType.IPV6); System.arraycopy(addressBytes, 0, buffer, 4, ADDRESS_LENGTH); buffer[4 + ADDRESS_LENGTH] = SocksUtil.getFirstByteFromInt(remoteServerPort); buffer[5 + ADDRESS_LENGTH] = SocksUtil.getSecondByteFromInt(remoteServerPort); System.arraycopy(data, 0, buffer, 6 + ADDRESS_LENGTH, packet.getLength()); return new DatagramPacket(buffer, buffer.length, destinationAddress.getAddress(), destinationAddress.getPort()); } else { throw new IllegalArgumentException("Only support java.net.InetSocketAddress"); } }
byte[] ipv4Bytes = inetAddress.getAddress();// todo System.arraycopy(ipv4Bytes, 0, bytes, 4, ipv4Bytes.length); bytes[8] = SocksUtil.getFirstByteFromInt(port); bytes[9] = SocksUtil.getSecondByteFromInt(port); break; byte[] ipv6Bytes = inetAddress.getAddress();// todo System.arraycopy(ipv6Bytes, 0, bytes, 4, ipv6Bytes.length); bytes[20] = SocksUtil.getFirstByteFromInt(port); bytes[21] = SocksUtil.getSecondByteFromInt(port); break; bytes[5 + i] = host.getBytes()[i]; bytes[5 + hostLength] = SocksUtil.getFirstByteFromInt(port); bytes[6 + hostLength] = SocksUtil.getSecondByteFromInt(port); break;
byte[] ipv4Bytes = inetAddress.getAddress();// todo System.arraycopy(ipv4Bytes, 0, bytes, 4, ipv4Bytes.length); bytes[8] = SocksUtil.getFirstByteFromInt(port); bytes[9] = SocksUtil.getSecondByteFromInt(port); break; byte[] ipv6Bytes = inetAddress.getAddress();// todo System.arraycopy(ipv6Bytes, 0, bytes, 4, ipv6Bytes.length); bytes[20] = SocksUtil.getFirstByteFromInt(port); bytes[21] = SocksUtil.getSecondByteFromInt(port); break; bytes[5 + i] = host.getBytes()[i]; bytes[5 + hostLength] = SocksUtil.getFirstByteFromInt(port); bytes[6 + hostLength] = SocksUtil.getSecondByteFromInt(port); break;
bytes[i + 4] = bindAddress.getAddress()[i]; bytes[8] = SocksUtil.getFirstByteFromInt(bindPort); bytes[9] = SocksUtil.getSecondByteFromInt(bindPort); break; bytes[i + 4] = bindAddress.getAddress()[i]; bytes[20] = SocksUtil.getFirstByteFromInt(bindPort); bytes[21] = SocksUtil.getSecondByteFromInt(bindPort); break;
bytes[i + 4] = bindAddress.getAddress()[i]; bytes[8] = SocksUtil.getFirstByteFromInt(bindPort); bytes[9] = SocksUtil.getSecondByteFromInt(bindPort); break; bytes[i + 4] = bindAddress.getAddress()[i]; bytes[20] = SocksUtil.getFirstByteFromInt(bindPort); bytes[21] = SocksUtil.getSecondByteFromInt(bindPort); break;