2009-02-02 28 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發送一個連接請求。這需要一些編碼,但它應該工作。它爲我做了。希望工程!祝你好運!