有两个连接的插座。我该如何互连?
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.
Linux能做到吗?可以通过欺骗连接跟踪来改变现有连接的跟踪状态吗?
@related Determine how much can I write into a filehandle; copying data from one FH to the other
答案 0 :(得分:4)
您是否知道splice()。基于您的两个问题,我认为这就是您的目标。最后我检查了你不能在一个splice调用中执行此操作,因为两个文件描述符都不能是套接字。但你应该能够在2个电话中进行(sockin-> pipe-> sockout)。另请查看tee()。这些可能不是你想要的,但我可以认为它们在球场上。
答案 1 :(得分:2)
您需要一个用户空间进程来挂起并将数据从一个套接字复制到另一个套接字。这很简单:
read
到套接字B的任何数据write
; read
,write
到套接字A; read
在套接字A上返回0,请在套接字B上调用shutdown(SHUT_WR)
; read
在套接字B上返回0,请在套接字A上调用shutdown(SHUT_WR)
; close
两个套接字并退出; EPIPE
,close
两个套接字并退出。如Newton Falls所述,您可以使用splice()
以零拷贝方式执行此操作,但这只是性能增强;让它首先使用read
/ write
。你应该只能fork()
关闭一个孩子这样做,这将使你的主要过程“火上浇油”。
答案 2 :(得分:0)
unix域套接字可能有所帮助。请参见手册页:
man unix
答案 3 :(得分:0)
查看socat工具。这是解决此类问题的最佳工具。