2012-10-22 56 views
5

我有一個系統,我想要監聽一個套接字並等待客戶端連接,然後將連接傳遞給另一個應該在建立連接後立即啓動的應用程序。將套接字路由到另一個端口

我對這個其他應用程序沒有控制權,只能設置它將偵聽的端口,但我希望爲每個新客戶端都有一個進程。

這就是我想要做的事:

routing

我一直在尋找一個解決方案,但我的事情我沒有正確的術語,但我設法找到理查德史蒂文斯的「Unix網絡編程」關於AF_ROUTE插座系列的一些可能與SOCK_RAW組合以將連接路由到另一個IP和端口。但是關於how to use this flag的文檔太少,似乎需要超級用戶權限(我想避免)。

也許有一個更容易的解決方案,但我可能使用錯誤的條款。是否清楚我想要做什麼?

+0

是應用程序和端口1:1映射嗎?如果是的話,他們爲什麼不能自己聽呢? – SparKot

+0

@SparKot不完全。對於每個新客戶端,必須打開一個新的「APP」 – JBernardo

+0

您能否說服另一個應用程序從另一個文件描述符(例如stdin)讀取?如果是這樣,那麼你可以''將套接字fd'複製到標準輸入和叉+執行其他應用程序。 –

回答

0

我不認爲你能夠像你想要的那樣「傳遞」套接字,特別是如果你不能改變和重新編譯「APP」。套接字包含各種管理開銷(資源管理等),這些開銷與他們擁有的進程相關聯。此外,如果您無法重新編譯APP,則無法繞過接受連接所涉及的步驟,並且您的路由器只需簡單地將已連接的「已連接」連接到該連接。

但是,你有沒有考慮過簡單地使用路由器作爲傳遞?基本上,你的「路由器」過程通過套接字連接到它產生的每個「APP」過程,並簡單地將從合適的客戶端收到的任何東西迴應給適當的APP,反之亦然,APP給客戶端?

這確實會增加開銷,並且您將不得不管理一個小映射來跟蹤哪些客戶端轉到哪個應用程序,但它可能有效(假設APP或客戶端沒有基於IP地址的任何行爲他們連接到等)。假設你不能重新編譯APP,可能沒有太多的其他選項。

此代碼相對簡單。您從APP收到的數據處理程序只是從您的映射中爲適當的應用程序查找套接字,然後對其進行非阻塞式發送。同樣,從客戶端接收數據的處理程序。根據客戶端和應用程序的行爲方式,您可能需要處理一些同步操作(如果您同時從兩者接收)。

+0

我不想在套接字上實際讀寫兩端進行通信。可能可以做的是從這個文件描述符中讀取「APP」。 – JBernardo

+0

hrm,也許你應該編輯問題來澄清APP可以做什麼和不可以做什麼?我讀「我無法控制這個其他應用程序,只能設置它將要監聽的端口」的方式讓我意識到它必須讀取一個套接字,並且沒有其他選項。如果APP有其他I/O選項,比如stdin/out或者其他一些命令行參數,你可以使用它來幫助回答者提出建議:) – davec

+0

我不認爲我可以這樣做,但是Adam Rosenfield的上面的評論可以是一個選擇。我現在正在嘗試,但我不知道它是否也可以 – JBernardo

相關問題