【发布时间】:2009-02-02 15:04:19
【问题描述】:
是否可以连接两个套接字?
例如,如果一个进程在某个时候充当 2 个其他进程之间的消息路由器,那么能够让位将节省大量套接字 IO。这似乎应该是可能的,但我什至从未听说过它正在完成!
如果可能,是否可以在 Linux 和 Windows 上使用?如果是这样,是否使用不同的机制来设置它?
顺便说一句:我刚刚发现了这个:
这似乎接近我的要求(当然假设这也适用于套接字 FD),但是是否有 Windows 等效项?
【问题讨论】:
是否可以连接两个套接字?
例如,如果一个进程在某个时候充当 2 个其他进程之间的消息路由器,那么能够让位将节省大量套接字 IO。这似乎应该是可能的,但我什至从未听说过它正在完成!
如果可能,是否可以在 Linux 和 Windows 上使用?如果是这样,是否使用不同的机制来设置它?
顺便说一句:我刚刚发现了这个:
这似乎接近我的要求(当然假设这也适用于套接字 FD),但是是否有 Windows 等效项?
【问题讨论】:
AFAIK,这是不可能的。
一个简单的例子:如果你的进程在三台不同的机器上运行,代理机器如何在不涉及 TCP/UDP/任何级别的流量重定向的情况下退出?
splice 不是一个解决方案,它只是优化 i/o 传输,避免不必要的内存复制,但无论如何,您需要一个循环输入并调用 splice 以将数据“传输”到输出的进程(如果套接字是真正的网络套接字,数据必须通过网卡两次)。
安德烈律师事务所
【讨论】:
简短的回答是否。
略长一点的答案是一般情况下。 splice() 系统调用是特定于 Linux 的,没有为套接字定义。如果 是为套接字定义的,那么它将是一种将内存映射文件连接到流套接字或从流套接字连接的方法。它不会是双向的。大神们只知道这个区域的 Windows 上存在什么。
过分怪异的答案是好吧,你可以扩展操作系统内核,但是......这可能不是你想要的。如果两个PF_INET 或PF_INET6 套接字的远程地址都不是节点本地的,那么路由器仍将在两个远程主机之间转发数据包,每个远程主机都有一个套接字5 元组引用您的路由器主机。不,我不会解释 ARP/ND6 欺骗的黑魔法来解决这个问题。
【讨论】:
我过去曾编写过类似的程序。假设您是所有三个进程的程序员,这是可能的,但很棘手。如果您有套接字连接 A 和套接字连接 B,则从 A 获取信息,将其发送给 B,然后让 B 向 A 发送连接请求。这需要一些编码,但它应该可以工作。它对我有用。希望有效!祝你好运!
【讨论】: