問題
我有一臺計算機,它應該通過 TCP 連接到兩臺機器(或者更確切地說是一組單獨的設備)。讓事情變得棘手的是,這兩臺機器共享相同的 IP 地址范圍并且也有部分相同的地址,只有一臺通過一個以太網配接器連接,另一臺通過第二個以太網配接器連接。
注意:地址范圍不是由我定義的,而是由這些機器的制造商定義的。不幸的是,我不得不和他們一起生活,就像他們一樣。
應該完成這項作業的程式是用 C/C 撰寫的。從程式的角度來看,連接是傳出的,所以我不能只系結傳入的連接并保留它們的 ID。
可能的解決方案
經過一些研究(例如,這里:Problems with SO_BINDTODEVICE Linux socket option),我嘗試將套接字系結到使用
setsockopt(socket, SOL_SOCKET, SO_BINDTODEVICE, "adapter name", strlen("adapter name");
事實證明,這只有在程式以超級用戶權限運行時才有效,我會盡量避免這種情況。否則,該函式會回傳一個錯誤代碼,這意味著權限被拒絕(我忘記了確切的短語)。
其他解決方案?
有沒有其他方法,我怎么能做到這一點?
uj5u.com熱心網友回復:
僅僅將套接字固定到特定的介面是行不通的,因為還有很多事情要做……如果你連接到 192.168.0.3,內核會查看路由表以找到正確的介面來發送包過來。如果要使用IP 通信,則路由表中不能有兩個具有相同子網規范 (192.168.0.0/24) 的條目。我想到了兩種解決方案:
為配接器設定預路由 NAT 以映射地址。例如,您可以將收到的包中的所有源地址映射
eth0到192.168.0.0\24范圍中,并將所有收到的源地址映射eth1到192.168.1.0\24。如果您在預路由過濾器鏈中添加此地址轉換,內核甚至不會注意到子網內部使用相同的 IP 地址范圍。如果沒有重復的 IP 地址(例如兩個網路中的 192.168.0.2),您可以設定一個
bridge介面。網橋的行為就像一個介面,連接到兩個網路。網橋的行為就像軟體交換機一樣。對于內核(和您的程式)來說,它看起來好像只有一個配接器,所有設備都插入其中。
這兩種解決方案都需要超級用戶權限才能設定,但在您設定一次之后,您的程式將不再需要它們。
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/427542.html
上一篇:為什么我的TCP客戶端在使用多個連接進行壓力測驗時無法連接到我的服務器并出現套接字例外
下一篇:獲取PHP8Socket的id
