comparison app/src/main/java/net/sourceforge/jsocks/SocksServerSocket.java @ 438:d29cce60f393

migrate from Eclipse to Android Studio
author Carl Byington <carl@five-ten-sg.com>
date Thu, 03 Dec 2015 11:23:55 -0800
parents src/net/sourceforge/jsocks/SocksServerSocket.java@205ee2873330
children
comparison
equal deleted inserted replaced
437:208b31032318 438:d29cce60f393
1 package net.sourceforge.jsocks;
2
3 import java.net.*;
4 import java.io.*;
5
6 /**
7 SocksServerSocket allows to accept connections from one particular
8 host through the SOCKS4 or SOCKS5 proxy.
9 */
10 public class SocksServerSocket extends ServerSocket{
11 //Data members
12 protected CProxy proxy;
13 protected String localHost;
14 protected InetAddress localIP;
15 protected int localPort;
16
17 boolean doing_direct = false;
18 InetAddress remoteAddr;
19
20 /**
21 * Creates ServerSocket capable of accepting one connection
22 * through the firewall, uses default CProxy.
23 *@param host Host from which the connection should be recieved.
24 *@param port Port number of the primary connection.
25 */
26 public SocksServerSocket(String host,int port)
27 throws SocksException,UnknownHostException,IOException{
28 this(CProxy.defaultProxy,host,port);
29 }
30 /**
31 *Creates ServerSocket capable of accepting one connection
32 *through the firewall, uses given proxy.
33 *@param p CProxy object to use.
34 *@param host Host from which the connection should be recieved.
35 *@param port Port number of the primary connection.
36 */
37 public SocksServerSocket(CProxy p,String host,int port)
38 throws SocksException,UnknownHostException,IOException{
39
40
41 super(0);
42 if(p == null) throw new SocksException(CProxy.SOCKS_NO_PROXY);
43 //proxy=p;
44 proxy = p.copy();
45 if(proxy.isDirect(host)){
46 remoteAddr = InetAddress.getByName(host);
47 proxy = null;
48 doDirect();
49 }else{
50 processReply(proxy.bind(host,port));
51 }
52 }
53
54 /**
55 * Creates ServerSocket capable of accepting one connection
56 * through the firewall, uses default CProxy.
57 *@param ip Host from which the connection should be recieved.
58 *@param port Port number of the primary connection.
59 */
60 public SocksServerSocket(InetAddress ip, int port) throws SocksException,
61 IOException{
62 this(CProxy.defaultProxy,ip,port);
63 }
64
65 /**
66 *Creates ServerSocket capable of accepting one connection
67 *through the firewall, uses given proxy.
68 *@param p CProxy object to use.
69 *@param ip Host from which the connection should be recieved.
70 *@param port Port number of the primary connection.
71 */
72 public SocksServerSocket(CProxy p,InetAddress ip, int port)
73 throws SocksException,IOException{
74 super(0);
75
76 if(p == null) throw new SocksException(CProxy.SOCKS_NO_PROXY);
77 this.proxy = p.copy();
78
79 if(proxy.isDirect(ip)){
80 remoteAddr = ip;
81 doDirect();
82 }else{
83 processReply(proxy.bind(ip,port));
84 }
85 }
86
87
88 /**
89 * Accepts the incoming connection.
90 */
91 public Socket accept() throws IOException{
92 Socket s;
93
94 if(!doing_direct){
95 if(proxy == null) return null;
96
97 ProxyMessage msg = proxy.accept();
98 s = msg.ip == null? new SocksSocket(msg.host,msg.port,proxy)
99 : new SocksSocket(msg.ip,msg.port,proxy);
100 //Set timeout back to 0
101 proxy.proxySocket.setSoTimeout(0);
102 }else{ //Direct Connection
103
104 //Mimic the proxy behaviour,
105 //only accept connections from the speciefed host.
106 while(true){
107 s = super.accept();
108 if(s.getInetAddress().equals(remoteAddr)){
109 //got the connection from the right host
110 //Close listenning socket.
111 break;
112 }else
113 s.close(); //Drop all connections from other hosts
114 }
115
116 }
117 proxy = null;
118 //Return accepted socket
119 return s;
120 }
121
122 /**
123 * Closes the connection to proxy if socket have not been accepted, if
124 * the direct connection is used, closes direct ServerSocket. If the
125 * client socket have been allready accepted, does nothing.
126 */
127 public void close() throws IOException{
128 super.close();
129 if(proxy != null) proxy.endSession();
130 proxy = null;
131 }
132
133 /**
134 Get the name of the host proxy is using to listen for incoming
135 connection.
136 <P>
137 Usefull when address is returned by proxy as the hostname.
138 @return the hostname of the address proxy is using to listen
139 for incoming connection.
140 */
141 public String getHost(){
142 return localHost;
143 }
144
145 /**
146 * Get address assigned by proxy to listen for incomming
147 * connections, or the local machine address if doing direct
148 * connection.
149 */
150 public InetAddress getInetAddress(){
151 if(localIP == null){
152 try{
153 localIP = InetAddress.getByName(localHost);
154 }catch(UnknownHostException e){
155 return null;
156 }
157 }
158 return localIP;
159 }
160
161 /**
162 * Get port assigned by proxy to listen for incoming connections, or
163 the port chosen by local system, if accepting directly.
164 */
165 public int getLocalPort(){
166 return localPort;
167 }
168
169 /**
170 Set Timeout.
171
172 @param timeout Amount of time in milliseconds, accept should wait for
173 incoming connection before failing with exception.
174 Zero timeout implies infinity.
175 */
176 public void setSoTimeout(int timeout) throws SocketException{
177 super.setSoTimeout(timeout);
178 if(!doing_direct) proxy.proxySocket.setSoTimeout(timeout);
179 }
180
181
182 //Private Methods
183 //////////////////
184
185 private void processReply(ProxyMessage reply)throws SocksException{
186 localPort = reply.port;
187 /*
188 * If the server have assigned same host as it was contacted on
189 * it might return an address of all zeros
190 */
191 if(reply.host.equals("0.0.0.0")){
192 localIP = proxy.proxyIP;
193 localHost = localIP.getHostName();
194 }else{
195 localHost = reply.host;
196 localIP = reply.ip;
197 }
198 }
199
200 private void doDirect(){
201 doing_direct = true;
202 localPort = super.getLocalPort();
203 localIP = super.getInetAddress();
204 localHost = localIP.getHostName();
205 }
206
207 }