/* * Copyright 2015-2025 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except * in compliance with the License. You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software distributed under the License * is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express * or implied. See the License for the specific language governing permissions and limitations under * the License. */ package sockslib.client; import sockslib.common.AddressType; import sockslib.utils.SocksUtil; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import java.net.InetAddress; import java.net.InetSocketAddress; import java.net.SocketAddress; import java.net.UnknownHostException; /** * The class <code>RequestCmdReplyMessage</code> represents the message that * sent by SOCKS server when client sends a command request. * * @author Youchao Feng * @version 1.0 * @date Mar 23, 2015 5:55:06 PM */ public class CommandReplyMessage implements SocksMessage { /** * Logger that subclasses also can use. */ protected Logger logger = LoggerFactory.getLogger(CommandReplyMessage.class); /** * The bytes that received from SOCKS server. */ private byte[] replyBytes; /** * Constructs an instance of {@link CommandReplyMessage} with an array of * bytes that received from SOCKS server. * * @param replyBytes The bytes that received from SOCKS server. */ public CommandReplyMessage(byte[] replyBytes) { this.replyBytes = replyBytes; } /** * Returns <code>true</code> if the command request is success. * * @return If the command request is success, it will return * <code>true</code>. */ public boolean isSuccess() { if (replyBytes.length < 10) { return false; } return replyBytes[1] == 0; } /** * Gets IP address from the bytes that sent by SOCKS server. * * @return IP address. * @throws UnknownHostException If the host is unknown. */ public InetAddress getIp() throws UnknownHostException { byte[] addressBytes = null; if (replyBytes[3] == AddressType.IPV4) { addressBytes = new byte[4]; } else if (replyBytes[3] == AddressType.IPV6) { addressBytes = new byte[16]; } System.arraycopy(replyBytes, 4, addressBytes, 0, addressBytes.length); return InetAddress.getByAddress(addressBytes); } /** * 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]); } /** * Returns the bytes that sent by SOCKS server. * * @return The bytes that sent by SOCKS server. */ public byte[] getReplyBytes() { return replyBytes; } /** * Sets reply bytes. * * @param replyBytes The bytes that sent by SOCKS server. */ public void setReplyBytes(byte[] replyBytes) { this.replyBytes = replyBytes; } /** * Gets the socket address. * * @return Socket address. */ public SocketAddress getSocketAddress() { try { return new InetSocketAddress(getIp(), getPort()); } catch (UnknownHostException e) { logger.error(e.getMessage(), e); } return null; } }