有两个连接的插座。我如何将它们互连?
int client = get_connected_client_socket(); int proxy = get_connected_proxy_socket(); 与代理协商(代理); iterconnect(客户端,代理); // 现在忘记了客户端和代理。 // 系统应该处理 IO/shutdown/close。 // 理想情况下,即使没有用户空间进程的任何支持。
Linux可以吗?可以通过欺骗连接跟踪来改变现有连接的跟踪状态来完成吗?
你知道splice()吗?根据你的两个问题,我认为这就是你要去的地方。最后我检查了您不能在一次拼接调用中执行此操作,因为两个文件描述符都不能是套接字。但是你应该能够通过两次调用来完成它(sockin->pipe->sockout)。另请查看 tee()。这些可能并不完全是您想要的,但据我所知,它们在大致范围内。
任何数据
read
write
到套接字B;任何数据read
write
到套接字A;如果 read
shutdown(SHUT_WR)
;如果 read
shutdown(SHUT_WR)
;一旦两个套接字都从读取返回 0,close
EPIPE
close
两个套接字均退出。
提到的,您可以使用 splice()
以零拷贝方式执行此操作,但这只是性能增强;首先让它与
read
/write
一起工作。您应该能够直接让孩子来完成此操作,这将使其在您的主要流程中“一劳永逸”。 Unix 域套接字可能会有所帮助。请参阅手册页:
检查 socat 工具。这是解决此类问题的最佳工具。
查看袜子图。听起来正是您想要的。
https://blog.cloudflare.com/sockmap-tcp-splicing-of-the-future