經(jīng)歷了千辛萬苦的嘗試,原來onvif上處理多網(wǎng)卡的選擇是如此簡單,soap的設(shè)計早就考慮好了此問題。
苦水不多說了,步驟如下:
1、獲取本機的各網(wǎng)卡的IP地址。
????? 在網(wǎng)上看見講得比較多的方法有兩個。
????? 一是將ipconfig? /all的運行結(jié)果保存到文件,然后分析出各IP地址。但是我實操時遇到了操作系統(tǒng)的語言問題。我測試了三臺電腦,一臺回復(fù)全英文的,一臺回復(fù)中英文結(jié)合的,裝了繁體系統(tǒng)的那臺返回英文和繁體結(jié)合的。想不到如何處理,于是放棄了本方法。希望各大牛能告訴我他們的處理方法。
???????第二種方法是通過gethostname,加gethostbyname這兩個庫函數(shù)組合獲取各網(wǎng)卡的IP地址。我選用就是此方法的,在這里我就不列舉我的具體做法了,感覺處理得不太好,給獻丑了,網(wǎng)上例子也不少。此方法可以獲取到AF_INET和IF_INET6的地址,并且很好地排除了工作站上那些“bluetooth 網(wǎng)絡(luò)”等不關(guān)心的網(wǎng)卡。
?
2、在soap中設(shè)置IP地址
???????? 只要設(shè)置好soap的ipv4_multicast_if參數(shù),一切就由soap內(nèi)部搞定了。很簡單吧。
struct?in_addr?if_req; if_req.s_addr?=?inet_addr("xxx.xxx.xxx.xxx");??//?想綁定的IP地址 soap.ipv4_multicast_if?=?(char*)soap_malloc(&soap,?sizeof(in_addr)); memset(soap.ipv4_multicast_if,?0,?sizeof(in_addr)); memcpy(soap.ipv4_multicast_if,?(char*)&if_req,?sizeof(if_req));
?????我是在設(shè)定setsockopt的IP_ADD_MEMBERSHIP參數(shù),即加入組播后設(shè)定以上參數(shù)的。
總結(jié):要不是偶然看見了soap結(jié)構(gòu)中有此參數(shù),可能我還沒能從解決問題的苦海中解放出來。看來必須再好好研究soap的結(jié)構(gòu)了。