private void onConnect(final ProxyMessage msg) throws IOException { Socket s; if (proxy == null) { s = new Socket(msg.ip, msg.port); } else { s = new SocksSocket(proxy, msg.ip, msg.port); } log.info("Connected to " + s.getInetAddress() + ":" + s.getPort()); ProxyMessage response = null; final InetAddress localAddress = s.getLocalAddress(); final int localPort = s.getLocalPort(); if (msg instanceof Socks5Message) { final int cmd = SocksProxyBase.SOCKS_SUCCESS; Socks5Message socks5Message = new Socks5Message(cmd, localAddress, localPort); socks5Message.setDnsResolver(dnsResolver); response = socks5Message; } else { final int cmd = Socks4Message.REPLY_OK; Socks4Message socks4Message = new Socks4Message(cmd, localAddress, localPort); socks4Message.setDnsResolver(dnsResolver); response = socks4Message; } response.write(out); startPipe(s); }
private void doAccept() throws IOException { Socket s = null; final long startTime = System.currentTimeMillis(); while (true) { s = ss.accept(); if (s.getInetAddress().equals(msg.ip)) { // got the connection from the right host // Close listenning socket. ss.close(); break; } else if (ss instanceof SocksServerSocket) { // We can't accept more then one connection s.close(); ss.close(); throw new SocksException(SocksProxyBase.SOCKS_FAILURE); } else { if (acceptTimeout != 0) { // If timeout is not infinit final long passed = System.currentTimeMillis() - startTime; final int newTimeout = acceptTimeout - (int) passed; if (newTimeout <= 0) { throw new InterruptedIOException("newTimeout <= 0"); } ss.setSoTimeout(newTimeout); } s.close(); // Drop all connections from other hosts } } // Accepted connection remote_sock = s; remote_in = s.getInputStream(); remote_out = s.getOutputStream(); // Set timeout remote_sock.setSoTimeout(iddleTimeout); final InetAddress inetAddress = s.getInetAddress(); final int port = s.getPort(); log.info("Accepted from {}:{}", s.getInetAddress(), port); ProxyMessage response; if (msg.version == 5) { final int cmd = SocksProxyBase.SOCKS_SUCCESS; Socks5Message socks5Message = new Socks5Message(cmd, inetAddress, port); socks5Message.setDnsResolver(dnsResolver); response = socks5Message; } else { final int cmd = Socks4Message.REPLY_OK; Socks4Message socks4Message = new Socks4Message(cmd, inetAddress, port); socks4Message.setDnsResolver(dnsResolver); response = socks4Message; } response.write(out); }
private void onBind(final ProxyMessage msg) throws IOException { ProxyMessage response = null; if (proxy == null) { ss = new ServerSocket(0); } else { ss = new SocksServerSocket(proxy, msg.ip, msg.port); } ss.setSoTimeout(acceptTimeout); final InetAddress inetAddress = ss.getInetAddress(); final int localPort = ss.getLocalPort(); log.info("Trying accept on {}:{}", inetAddress, localPort); if (msg.version == 5) { final int cmd = SocksProxyBase.SOCKS_SUCCESS; Socks5Message socks5Message = new Socks5Message(cmd, inetAddress, localPort); socks5Message.setDnsResolver(dnsResolver); response = socks5Message; } else { final int cmd = Socks4Message.REPLY_OK; Socks4Message socks4Message = new Socks4Message(cmd, inetAddress, localPort); socks4Message.setDnsResolver(dnsResolver); response = socks4Message; } response.write(out); mode = ACCEPT_MODE; pipe_thread1 = Thread.currentThread(); pipe_thread2 = new Thread(this); pipe_thread2.start(); // Make timeout infinit. sock.setSoTimeout(0); int eof = 0; try { while ((eof = in.read()) >= 0) { if (mode != ACCEPT_MODE) { if (mode != PIPE_MODE) { return; // Accept failed } remote_out.write(eof); break; } } } catch (final EOFException e) { log.debug("Connection closed while we were trying to accept", e); return; } catch (final InterruptedIOException e) { log.debug("Interrupted by unsucessful accept thread", e); if (mode != PIPE_MODE) { return; } } finally { // System.out.println("Finnaly!"); } if (eof < 0) { return; } // Do not restore timeout, instead timeout is set on the // remote socket. It does not make any difference. pipe(in, remote_out); }