天天看點

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;

          else

            udp_repeat = 1;

          udp_delay = ((unsigned int)soap_random % 201) + 50;

          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_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;

        }

給闆端添加路由指令route add -host 239.255.255.250 dev eth0 後ok,可以正常搜尋裝置。

繼續閱讀