I recently needed a TCP port-forwarder that sits on a socket connection and
monitors it. My concrete use-case is that I need to front the backend-server of
my TV application with such a port forwarder in order to create live-TV
streaming sessions as soon as a client requests them and also tears them down shortly
after the client disconnects so that the session doesn’t need to time out
and blocks the tuner until then. The backend also requires that I do a
periodical “keep-alive” ping every 30-40 seconds, which isn’t
a very practical requirement for some of my client scenarios. Therefore, I
needed, generally speaking, something that would sit between the client and the
backend server, monitors the data stream and would let me run some code (set up
the live session and start the keep-alive timer) when I get a new client connection
and just before I connect through to the target and which would let me run some
code (shut down the session and stop the keep-alive) as soon as the connection
is torn down.
Since, I didn’t find one (or was too blind or too lazy, you know how
that goes), I wrote one. It’s a fully asynchronous TcpListener/TcpClient
based implementation, it’s fast and stable enough for my purposes and it
might or might not be for yours, it has a bit of tolerance for targets that don’t
accept a connection on the first try, and you can hook up events to “before
target connect” and “after target disconnect”. Since all the
bytes fly by, you can instrument the thing further or monitor the stream as you
like.
The code is pretty straightforward, even though the asynchronous calls/callbacks
admittedly make the execution paths in the implementation a bit challenging to
follow, and should not require much further explanation. You construct an
instance of TcpPortForwader passing the local port and the target port
and host to forward to, call Start() and the listener starts listening. Stop()
stops the listener. You can call Start() from any thread; the listener
will implicitly use thread-pool threads to run on its own. Hook up the events
and they are being raised. Simple enough. Download below.
Download: TcpPortForwarder.zip