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

问题描述 投票:0回答:5

有两个连接的插座。我如何将它们互连?

  1. 一个套接字上出现的数据应写入另一个套接字。
  2. EOF/FIN 应该传播良好。如果其中一个是半封闭的,另一个也应该是半封闭的。
int client = get_connected_client_socket();
int proxy = get_connected_proxy_socket();
与代理协商(代理);
iterconnect(客户端,代理);
// 现在忘记了客户端和代理。
// 系统应该处理 IO/shutdown/close。
// 理想情况下,即使没有用户空间进程的任何支持。

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

@相关确定我可以向文件句柄写入多少内容;将数据从一个 FH 复制到另一个 FH

linux networking sockets
5个回答
5
投票

你知道splice()吗?根据你的两个问题,我认为这就是你要去的地方。最后我检查了您不能在一次拼接调用中执行此操作,因为两个文件描述符都不能是套接字。但是你应该能够通过两次调用来完成它(sockin->pipe->sockout)。另请查看 tee()。这些可能并不完全是您想要的,但据我所知,它们在大致范围内。


3
投票

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

提到的,您可以使用 splice() 以零拷贝方式执行此操作,但这只是性能增强;首先让它与

read
/
write
一起工作。您应该能够直接让孩子来完成此操作,这将使其在您的主要流程中“一劳永逸”。
    
Unix 域套接字可能会有所帮助。请参阅手册页:


0
投票

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

0
投票

查看袜子图。听起来正是您想要的。

https://blog.cloudflare.com/sockmap-tcp-splicing-of-the-future

0
投票

© www.soinside.com 2019 - 2024. All rights reserved.