如何在Linux中“互连”两个套接字?

有两个连接的sockets。 我怎样才能互相连接?

  1. 在一个套接字上出现的数据应该被写入另一个。
  2. EOF / FIN应该传播良好。 如果一方半封闭,另一方也应半封闭。
 int client = get_connected_client_socket();
 int proxy = get_connected_proxy_socket();
 negotiate_with_proxy(代理);
 iterconnect(客户端,代理); 
 //现在忘记了客户端和代理。 
 //系统应该处理IO /关机/closures。 
 //理想的是,甚至没有任何用户空间进程的支持。

Linux能做到吗? 可以通过欺骗连接跟踪来改变现有连接的跟踪状态吗?

@相关确定我能写多less文件句柄; 将数据从一个FH复制到另一个

你知道拼接() 。 根据你的两个问题,我认为这是你的目标。 最后我检查了你不能在一个拼接调用中做到这一点,因为两个文件描述符不能是套接字。 但是你应该可以在2个调用中完成(sockin-> pipe-> sockout)。 也看看tee() 。 这些可能不是你想要的,但是从我所能想象到的他们正在进入。

您将需要一个用户空间进程来挂起,并将数据从一个套接字复制到另一个套接字。 这很简单:

  • 从套接字A read任何数据, write套接字B;
  • 从套接字B read任何数据, write套接字A;
  • 如果套接字A上的read返回0,则调用套接字B上的shutdown(SHUT_WR)
  • 如果套接字B上的read返回0,则调用套接字A上的shutdown(SHUT_WR)
  • 一旦两个套接字从读取返回0, close两个套接字并退出;
  • 如果任一套接字返回EPIPE ,则close两个套接字并退出。

正如牛顿瀑布所提到的,你可以使用splice()以零拷贝的方式来做到这一点,但这只是一个性能提升; 让它首先read / write 。 你应该能够把一个孩子fork() ,这样做会让你的主进程“火,忘了”。

unix域套接字可能会有所帮助。 见手册页:

 man unix 

检查socat工具。 这是解决这类问题的最佳工具。