ONVIF中调用soap_send___wsdd__Probe返回-1问题排查

最近在海思的开发板上调用ONVIF来搜索局域网内的摄像头,发现同样的代码,直接编译运行在板端就可以正常搜索,将代码合到已有的QT代码中,就无法搜索,soap_send___wsdd__Probe返回-1。将板卡多余网口关闭,并且在程序中指定网口IP均不能解决问题。

经过两天排查,发现问题出现在stdsoap2.c的fsend函数中,在下述代码中,当程序sendto全局广播包时,返回-1(nwritten=-1),getlasterror得到101,经查为路由错误。

  if (nwritten < 0)
        { int udp_repeat;
          int udp_delay;
          if ((soap->connect_flags & SO_BROADCAST))
            udp_repeat = 2; /* SOAP-over-UDP MULTICAST_UDP_REPEAT - 1 */
          else
            udp_repeat = 1; /* SOAP-over-UDP UNICAST_UDP_REPEAT - 1 */
          udp_delay = ((unsigned int)soap_random % 201) + 50; /* UDP_MIN_DELAY .. UDP_MAX_DELAY */
          do
          { tcp_select(soap, sk, SOAP_TCP_SELECT_ERR, -1000 * udp_delay);
            if (soap->peerlen)
              nwritten = sendto(sk, (char*)s, (SOAP_WINSOCKINT)n, soap->socket_flags, (struct sockaddr*)&soap->peer, (SOAP_WINSOCKINT)soap->peerlen); 
            else
              nwritten = send(sk, s, (SOAP_WINSOCKINT)n, soap->socket_flags);
            udp_delay <<= 1;
            if (udp_delay > 500) /* UDP_UPPER_DELAY */
              udp_delay = 500;
          }
          while (nwritten < 0 && --udp_repeat > 0);
        }
        if (nwritten < 0)
        { err = soap_socket_errno(sk);
          if (err && err != SOAP_EINTR)
          { soap->errnum = err;
            return SOAP_EOF;
          }
          nwritten = 0; /* and call write() again */
        }


给板端添加路由命令route add -host 239.255.255.250 dev eth0 后ok,可以正常搜索设备。

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值