Comp 343 program 1: port forwarder
Due: Friday, November 21, 2014
This program forwards a connection from one socket (host/port pair) to
another. For example, when started on host foohost
with the command line
java forwarder 3333 outhost 44
then every time a connection is made to foohost:3333, a new connection is
made to outhost:44 and two copier threads are created to copy the data
between the two connections (one copier thread for each direction). The net
result is that it appears to the user that a connection to foohost:3333 is
actually a connection to outhost:44. No timeouts are needed, though thread
creation is necessary.
You are to print a line or two for each connection, indicating the original
source (host,port) for the incoming connection, and the port used for the
outbound forwarded connection. Note that this has a practical security
implication, in that these status lines may be your only warning that
someone else is using your forwarder! A suggested improvement is to check
the incoming TCP source and reject connections from hosts other than the one
you're using to test this.
Thread creation is demonstrated in the threaded stalk server file. I'm also
giving you the Copier class (as an inner class, defined in forwarder.java),
that is thread-ready and which takes two sockets from
and to and arranges to copy from
the from socket to the to
socket. To set up the copying, you first have the two sockets, s1 (the
inbound socket from the accept() call) and s2 (the new second connection you
create). You then create two Copier objects, one inbound
= Copier(s1,s2) and one outbound
= Copier(s2,s1), and then start
both the threads:
new
Thread(inbound).start();
new
Thread(outbound).start();
Here the inbound Copier object
handles data from the initiating host (foohost) to outhost,
and the outbound Copier object
handles the reverse. Note that after these threads have been created, your
main program can return to the accept() call to wait for more inbound
connections. In this sense, forwarder acts like the threaded stalk server,
tstalks.java.
To get started, use forwarder.java.
A good way to test your program, if you are doing development on your own
workstation, is to start with
java forwarder 3333 www.luc.edu 80
Then fire up a web browser and point it at localhost:3333. You should get
Loyola's web page (though notice we cannot rule out any "direct"
subconnections). If you are working on a linux server, remotely, say
hopper.cs.luc.edu, then start the command above on hopper and then point
your browser at hopper.cs.luc.edu:3333.
If you don't want to use command-line parameters, you can embed into your
program appropriate values for INPORT, OUTHOST and OUTPORT (eg INPORT=3333;
OUTHOST="www.luc.edu", OUTPORT=80).
You may have to change the port number if you are working in a shared
environment.
Do not leave your forwarder running
longer than you need to test it.
Note that the ssh program has built-in forwarding like
this.