加入2个插座?

时间:2009-02-02 15:04:19

标签: sockets system

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

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

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

顺便说一句:我刚刚发现了这个:

Linux splice() system call.

这看起来很接近我所要求的(假设当然这也适用于套接字FD),但它是否有Windows等价物?

3 个答案:

答案 0 :(得分:2)

AFAIK,这是不可能的。

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

splice不是一个解决方案,它只是优化了i / o传输,避免了不必要的内存拷贝,但无论如何,你需要一个循环输入和调用splice的进程来“传输”数据到输出(如果是套接字)是真正的网络套接字,数据必须通过网卡两次。)

LLP,Andrea

答案 1 :(得分:1)

简短的回答是

稍长的答案是不一般splice()系统调用是特定于Linux的,并未针对套接字定义。如果要为套接字定义 ,那么它将是一种将内存映射文件连接到流套接字或从流套接字连接的方法。它不是双向的。众神只知道Windows上存在的东西。

过分怪异的回答是嗯,你可以扩展操作系统内核,但是...... 这可能不是你想要的。如果两个PF_INETPF_INET6套接字的远程地址都不是节点本地的,那么路由器仍将在两个远程主机之间转发数据包,每个远程主机都有一个引用您的套接字5元组路由器主机。不,我将解释ARP / ND6欺骗的黑暗艺术来解决这个问题。

答案 2 :(得分:1)

我过去曾编程过这样的事情。假设您是所有三个进程的程序员,但它很可能但很棘手。如果您有套接字连接A和套接字连接B,则从A获取信息,将其发送到B并让B向A发送连接请求。这将需要一些编码,但它应该可以工作。它对我有用。希望有效!祝你好运!