经历了千辛万苦的尝试,原来onvif上处理多网卡的选择是如此简单,soap的设计早就考虑好了此问题。
苦水不多说了,步骤如下:
1、获取本机的各网卡的IP地址。
在网上看见讲得比较多的方法有两个。
一是将ipconfig /all的运行结果保存到文件,然后分析出各IP地址。但是我实操时遇到了操作系统的语言问题。我测试了三台电脑,一台回复全英文的,一台回复中英文结合的,装了繁体系统的那台返回英文和繁体结合的。想不到如何处理,于是放弃了本方法。希望各大牛能告诉我他们的处理方法。
第二种方法是通过gethostname,加gethostbyname这两个库函数组合获取各网卡的IP地址。我选用就是此方法的,在这里我就不列举我的具体做法了,感觉处理得不太好,给献丑了,网上例子也不少。此方法可以获取到AF_INET和IF_INET6的地址,并且很好地排除了工作站上那些“bluetooth 网络”等不关心的网卡。
2、在soap中设置IP地址
只要设置好soap的ipv4_multicast_if参数,一切就由soap内部搞定了。很简单吧。
[cpp] view plaincopy
- 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));</SPAN>
我是在设定setsockopt的IP_ADD_MEMBERSHIP参数,即加入组播后设定以上参数的。
总结:要不是偶然看见了soap结构中有此参数,可能我还没能从解决问题的苦海中解放出来。看来必须再好好研究soap的结构了。