Soap_bind 问题 Address already in use 终于解决

作者:Yoto  [email protected]转载请注明出处

http://blog.csdn.net/olei_oleitao

 

最近一个月在开发onvif的开发;遇到唯一并且男解决的问题就是 bind 出错情况 老是出现“Address already in use”socket 系统错误! 

和此问题纠缠了不少时间,从onvif的开发一个月前 ,做onvif评估开发等就有这个问题,由于在linux虚拟机上跑这个程序不会出现该问题;后来移植到arm上就冒出来了!

由于一面开发 又忙着解决问题 一直都没有很好的解决!就提交程序测试时也是勉强解决,解决办法是在线程里面进行bind 即使是出错也是刚开始会,但是后面会OK!当时就提交测试了! 后面再网上查了socke的一些资料,并且字节写程序测试,不采用soap的库函数 进行测试都无问题!然后在提交测试的后一天,还是不死心!就去看soap的源码,发现他们的函数没有用 SO_REUSEADDR 该参数进行设置socket 终于恍然大悟 哈哈 !修改他们的库函数 最终终于解决他们这个问题!

现在我将我的代码贴出来 请大家走参考!

if(setsockopt(soap->master,SOL_SOCKET,SO_REUSEADDR, (char*)&len, sizeof(int)) < 0)
 {
  ONVIFAPP_PRINTF("file =%s line =%d setsockopt faild \n",__FILE__,__LINE__);
  soap->errnum = soap_socket_errno(soap->master);
  DBGLOG(TEST, SOAP_MESSAGE(fdebug, "setsockopt  SO_REUSEADDR ERROR\n"));
  soap_closesock(soap);
  soap_set_receiver_error(soap, tcp_error(soap), "setsockopt failed in soap_bind()", SOAP_TCP_ERROR);
      return SOAP_INVALID_SOCKET;
 }

你可能感兴趣的:(onvif)