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





