2013-10-09 60 views
2

我一直在試圖弄清楚這一點。給定一個Linux插座,我該如何如何確定Linux套接字在C++中綁定的接口

  1. 確定是否綁定?
  2. 如果已綁定,請確定它在多宿主系統上綁定的網絡接口的哪個子集?

總之,我有一臺機器有多個網卡和一個只綁定到這些卡的一個子集的插座。我想以編程方式檢測並記錄這些接口在被綁定之後,否則在我們的庫中意味着我無法在綁定時訪問此信息。

我還要指出的是,我需要優選與SCTP套接字工作的IPV4/6兼容的解決方案(雖然我很好,現在UDP或TCP解決方案)

回答

1

getsockname函數返回套接字名稱即本地套接字地址。只需調用此函數來獲得未綁定和已綁定的套接字來確定套接字實現的行爲。

EDIT: 當你有一個AF_INET(即IPv4)的插座,該構件sin_addr.S_un.S_addr等同於已傳遞給bind功能在SOCKADDR_IN結構適當構件。因此,如果綁定到INADDR_ANY,則當套接字未綁定到特定的網絡適配器時,您會得到INADDR_ANY

我檢查了這與我的操作系統(Windows 7)的套接字實現。如果您的實現返回其他內容,則可能會遇到由其他位置的錯誤導致的未定義行爲。當然,如果您有源代碼可用,您可以驗證網絡堆棧的實現。

不支持綁定到網絡適配器的子集。你只能綁定到一個或所有。

+0

這對於套接字綁定到多個接口的情況如何工作? – Bob9630

+0

如何將一個套接字綁定到多個接口?函數'bind'接受一個struct sock_addr'。 – harper

+0

它可能與INADDR_ANY或in6addr_any綁定在技術上是所有接口。我對上述不好的措辭表示歉意。我看到的問題是,當我調用getsockname()時,我沒有回到接口/主機。相反,我看到顯然是垃圾。我不應該找回指示INADDR_ANY或in6addr_any的東西嗎? – Bob9630