/** * Gets port from bytes that sent by SOCKS server. * * @return port. */ public int getPort() { return SocksUtil.bytesToInt(replyBytes[replyBytes.length - 2], replyBytes[replyBytes.length - 1]); }
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; default:
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; default:
bytes[i + 4] = bindAddress.getAddress()[i]; bytes[8] = SocksUtil.getFirstByteFromInt(bindPort); bytes[9] = SocksUtil.getSecondByteFromInt(bindPort); break; case AddressType.IPV6: bytes[i + 4] = bindAddress.getAddress()[i]; bytes[20] = SocksUtil.getFirstByteFromInt(bindPort); bytes[21] = SocksUtil.getSecondByteFromInt(bindPort); break; case AddressType.DOMAIN_NAME:
/** * Gets port from bytes that sent by SOCKS server. * * @return port. */ public int getPort() { return SocksUtil.bytesToInt(replyBytes[replyBytes.length - 2], replyBytes[replyBytes.length - 1]); }
@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"); } }
/** * Get an integer from a byte array. * * @param bytes A byte array. * @return an integer. */ public static int bytesToInt(byte[] bytes) { if (bytes.length != 2) { throw new IllegalArgumentException("byte array size must be 2"); } return bytesToInt(bytes[0], bytes[1]); }
bytes[i + 4] = bindAddress.getAddress()[i]; bytes[8] = SocksUtil.getFirstByteFromInt(bindPort); bytes[9] = SocksUtil.getSecondByteFromInt(bindPort); break; case AddressType.IPV6: bytes[i + 4] = bindAddress.getAddress()[i]; bytes[20] = SocksUtil.getFirstByteFromInt(bindPort); bytes[21] = SocksUtil.getSecondByteFromInt(bindPort); break; case AddressType.DOMAIN_NAME:
/** * Get an integer from a byte array. * * @param bytes A byte array. * @return an integer. */ public static int bytesToInt(byte[] bytes) { if (bytes.length != 2) { throw new IllegalArgumentException("byte array size must be 2"); } return bytesToInt(bytes[0], bytes[1]); }
@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"); } }
logger.error(e.getMessage(), e); remoteServerPort = SocksUtil.bytesToInt(data[8], data[9]); originalData = Arrays.copyOfRange(data, 10, packet.getLength()); break; throw new SocksException("Unknown host"); remoteServerPort = SocksUtil.bytesToInt(data[20], data[21]); originalData = Arrays.copyOfRange(data, 22, packet.getLength()); break; logger.error(e.getMessage(), e); remoteServerPort = SocksUtil.bytesToInt(data[5 + DOMAIN_LENGTH], data[6 + DOMAIN_LENGTH]); originalData = Arrays.copyOfRange(data, 7 + DOMAIN_LENGTH, packet.getLength()); break;
logger.error(e.getMessage(), e); remoteServerPort = SocksUtil.bytesToInt(data[8], data[9]); originalData = Arrays.copyOfRange(data, 10, packet.getLength()); break; throw new SocksException("Unknown host"); remoteServerPort = SocksUtil.bytesToInt(data[20], data[21]); originalData = Arrays.copyOfRange(data, 22, packet.getLength()); break; logger.error(e.getMessage(), e); remoteServerPort = SocksUtil.bytesToInt(data[5 + DOMAIN_LENGTH], data[6 + DOMAIN_LENGTH]); originalData = Arrays.copyOfRange(data, 7 + DOMAIN_LENGTH, packet.getLength()); break;
port = SocksUtil.bytesToInt(portBytes);
port = SocksUtil.bytesToInt(portBytes);