Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Read and write to the same netcat tcp connection

Say I write to a netcat connection:

tail -f ${file} | nc localhost 7050 | do_whatever | nc localhost 7050

what happens here is that we have two socket connections, to do some request/response. But that's not ideal for a few reasons.

What I am looking to do is reuse the same connection, to read from and write to.

Does anyone know how I can reuse just one netcat connection?

like image 374
Alexander Mills Avatar asked Aug 31 '25 15:08

Alexander Mills


2 Answers

The correct way to do this in UNIX is to make use of a back pipe. You can do so as follows:

First, create a pipe: mknod bkpipe p

This creates a file named bkpipe of type pipe.

Next, figure out what you need to do. Here are two useful scenarios. In these, replace the hosts/addresses and port numbers with the appropriate ports for your relay.

To forward data sent to a local port to a remote port on another machine:

 nc -l -p 9999 0<bkpipe | nc remotehost 7000 | tee bkpipe

To connect to another machine and then relay data in that connection to another:

 nc leftHost 6000 0<bkpipe | nc rightHost 6000 | tee bkpipe

If you simply need to handle basic IPC within a single host, however, you can do away with netcat completely and just use the FIFO pipe that mknod creates. If you stuff things into the FIFO with one process, they will hang out there until something else reads them out.

like image 128
David Hoelzer Avatar answered Sep 02 '25 11:09

David Hoelzer


Yeah, I think the simplest thing to do is use this method:

tail -f ${file} | nc localhost 7050 | do_whatever > ${file}

just write back into the same file (it's a 'named pipe').

As long as your messages are less than about 500 bytes, they won't interleave.

like image 38
Alexander Mills Avatar answered Sep 02 '25 12:09

Alexander Mills