There are two connected sockets. How can I interconnect them?
- Data appeared on the one socket should be written to the other.
- EOF/FIN should propogate well. If one is half-closed, the other should also be half-closed.
int client = get_connected_client_socket(); int proxy = get_connected_proxy_socket(); negotiate_with_proxy(proxy); iterconnect(client, proxy); // Now forgot about both client and proxy. // System should handle IO/shutdown/close. // Ideally even without any support of the user-space process.
Can Linux do it? Can it be done by tricking connection tracking to change tracking status of existing connection?
@related Determine how much can I write into a filehandle; copying data from one FH to the other
You will need a userspace process to hang around and do the copying of data from one socket to the other. It's pretty simple though:
read
from socket A,write
to socket B;read
from socket B,write
to socket A;read
returns 0 on socket A, callshutdown(SHUT_WR)
on socket B;read
returns 0 on socket B, callshutdown(SHUT_WR)
on socket A;close
both sockets and exit;EPIPE
,close
both sockets and exit.As Newton Falls mentions, you can use
splice()
to do this in a zero-copy manner, but that's just a performance enhancement; get it working withread
/write
first. You should be able to justfork()
off a child to do this, which will make it "fire and forget" for your main process.A unix domain socket may help. See the man page:
Checkout the socat tool. That's the best tool to solve this kind of problems.
Are you aware of splice(). Based on your two questions I think this is where you are headed. Last I checked you can't do this in one splice call because both of file descriptors can't be sockets. But you should be able to do it in 2 calls (sockin->pipe->sockout). Also take a look at tee(). These may not be exactly what you want but from what I can figure they are in the ballpark.