2009-02-02 61 views
2

是否可以加入两个套接字?加入2个插座?

例如,如果一个进程充当两个其他进程之间的消息路由器,那么在某个时刻可以停下来就会节省一堆套接字IO。这似乎应该是可能的,但我从来没有听说过它的成就!

如果可能,是否可以在Linux和Windows上使用?如果是这样,是否有不同的机制来设置呢?

BTW:我刚刚发现这一点:

Linux splice() system call.

这似乎接近我所要求的(假设当然这适用于插座FD的也一样),但有一个Windows相同呢?

回答

2

AFAIK,这是不可能的。

一个简单的例子:如果你的进程在三台不同的机器上运行,代理服务器如何在不涉及TCP/UDP /任何级别的流量重定向的情况下离开呢?

拼接不是一个解决方案,它只是优化I/O传输,避免不必要的存储器副本,但无论如何,您需要一个循环输入和调用拼接以“传输”数据到输出的进程套接字是真正的网络套接字,数据必须通过网卡两次)。

LLP,安德烈

+0

我发布后认为,要真正做到这一点,需要在tcp/ip层支持......如果路由器可以发送一些带外数据包给客户端,说“无缝切换所有目标地址为xxxx这个插座“...然后它会工作... – dicroce 2009-02-02 16:10:56

1

简短的回答是没有

稍长的答案是不一般。系统调用splice()是特定于Linux的,并且没有为套接字定义。如果是为套接字定义的,那么它将是一种将存储器映射文件连接到流套接字或从流套接字连接的方式。它不会是双向的。神只知道这个区域在Windows上存在什么。

过于令人讨厌的答案是那么,你可以扩展操作系统内核,但...可能不是你想要的。如果两个PF_INETPF_INET6套接字的远程地址都不是node-local,那么路由器仍然会在两台远程主机之间转发数据包,每台远程主机都有一个引用您路由器主机的套接字5元组。不,我会不是解释ARP/ND6欺骗的黑暗艺术来解决这个问题。

1

我已经编程过类似的东西。假设,你是所有三个进程的程序员,这是可能的,但棘手。如果你有套接字连接A和套接字连接B,你从A获取信息,将它发送给B,并让B向A发送一个连接请求。这需要一些编码,但它应该工作。它为我做了。希望工程!祝你好运!