2008-09-23 49 views
0

我有一個TCP服務器只在特定的接口上偵聽。如果傳入的連接來自xxx.xxx.xxx.0子網,那麼我想要在accept()之後調用數據,然後數據應該通過intf1,否則應該通過intf2發送數據,這是我的服務器正在偵聽的地方。手動選擇TCP上的一個接口來發送數據

這兩個接口都具有相同的路由設置和優先級。所有的網絡都可以從這兩個接口訪問。

一種方法是通過intf1添加一個具有更高優先級的新路由,但我希望這是一個基於代碼的決定。

該代碼是在純C寫在Linux上。

+0

可能有很好的方法來解決你認爲會解決的任何問題。但這可能不是正確的做法。 – 2011-08-18 23:10:03

回答

0

不幸的是,您的選擇是有限的,因爲TCP/IP堆棧在內核中實現,您的接口是路由表。你最好的選擇是手動分配一條路線。

你也可以使用netlink庫來實時添加/刪除路由,但是有些部分的TCP數據包會在錯誤的接口上傳輸,直到調用完成。當您的數據包與原始接口的地址通過另一個接口發射時,您可能會遇到路由問題。

1

儘管它不完全是您正在尋找的純粹的C選項,也許您可​​以在收到accept()後使用iptables規則。

(雖然快速看一下/ lib中/ iptables的表明你可能是運氣)

我想象將所有TCP流量重定向到您指定的設備的規則。您甚至可以使規則知道套接字狀態,以便在accept()之後不需要提名接口。


這一切都適用,直到我發現計劃中的明顯缺陷,拍我的頭,說「哦!」

相關問題