Onvif 设备发现的多网卡选择问题


点击打开链接

经历了千辛万苦的尝试,原来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 plain copy
  1. struct in_addr if_req;  
  2. if_req.s_addr = inet_addr("xxx.xxx.xxx.xxx");  // 想绑定的IP地址  
  3. soap.ipv4_multicast_if = (char*)soap_malloc(&soap, sizeof(in_addr));  
  4. memset(soap.ipv4_multicast_if, 0, sizeof(in_addr));  
  5. memcpy(soap.ipv4_multicast_if, (char*)&if_req, sizeof(if_req));</SPAN>  

     我是在设定setsockopt的IP_ADD_MEMBERSHIP参数,即加入组播后设定以上参数的。

总结:要不是偶然看见了soap结构中有此参数,可能我还没能从解决问题的苦海中解放出来。看来必须再好好研究soap的结构了。


你可能感兴趣的:(Onvif 设备发现的多网卡选择问题)