如何在Linux中“互连”两个插槽?

时间:2010-04-20 17:29:03

标签: linux networking sockets

有两个连接的插座。我该如何互连?

  1. 一个套接字上出现的数据应写入另一个套接字。
  2. EOF / FIN应该很好地传播。如果一个半闭,另一个也应该半闭。
  3. 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

4 个答案:

答案 0 :(得分:4)

您是否知道splice()。基于您的两个问题,我认为这就是您的目标。最后我检查了你不能在一个splice调用中执行此操作,因为两个文件描述符都不能是套接字。但你应该能够在2个电话中进行(sockin-> pipe-> sockout)。另请查看tee()。这些可能不是你想要的,但我可以认为它们在球场上。

答案 1 :(得分:2)

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

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

Newton Falls所述,您可以使用splice()以零拷贝方式执行此操作,但这只是性能增强;让它首先使用read / write。你应该只能fork()关闭一个孩子这样做,这将使你的主要过程“火上浇油”。

答案 2 :(得分:0)

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

man unix

答案 3 :(得分:0)

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