gsoap实现ONVIF服务

来源:互联网 发布:vue.js transitionend 编辑:程序博客网 时间:2024/05/03 21:00

编译gsoap过程:将所有的cpp文件放到一个工程里面,把所有的虚函数到实现以后还是编译不过。

原因:没有openssl,所以确实相关的定义

2、namespase找不到,原来得加上相应的头文件,至于是什么文件,我忘了


实现过程:

1、调用run函数后,就可以接收客户端的命令了,但是probe命令总也收不到,好像和没有加入组播组有关系,但是我加了还是没有收到。只能收到单播传来的probe信息,但是又出现问题了,不能接下客户端给我发送过来的命令,总是说tag匹配不上,查了半天也找不到原因,好了就只能暂放了

2、后来probe命令就搁浅了。继续实现了GetDeviceInfo,这个还是很顺利的。

3、开始打程序的框架,就仿照的run函数,起了住进程,来接受客户端命令,刚开始的时候,还打算起好多个run,因为每个类都有自己的run函数,因为run函数都是阻塞进行的,我还特意起了好多的线程来起run函数,到后来又发现了问题,客户端得到url后只会向一个端口发送内容,这样就会导致命令不能被合适的类的run函数接收到,最后实验失败,只能自己仿照着run函数来写自己的主函数。

但是还是出现了问题:这个是不能简单的模仿的,因为我是创建了一个soap基本对象struct soap,然后收到命令后,比较他们的tag,看看应该由那哪个类来处理,就将这个基本对象复制给它,接下来的事情就交给新建的对象了,但是有个soap_peek函数,这个函数在基本对象里面调用过了,所以到了派生对象里面,就不再调用了,这就导致了,还是不能成功的match tag,也就不能成功的接下命令并做相应的操作。后来I就改成自己用strstr判断该由哪个类来处理命令

3、后来实现GetCapabilities,这个时候问题就来了。刚开始的时候,以为像是完成GetDeviceInfo一样那么简单呢,还想着以后进度就快了呢,没想到又有新问题了。给response对象赋值的时候,总是会崩溃,后来就看来看网上是怎么实现的,原来这个时候就用到了soap_malloc,因为response对象里面都是指针,所以需要申请空间,当按照网上的写了以后,还是有问题

虽然可以运行了,但是每次客户端发来命令的时候,总是会崩溃,而且还蹦在了一个又40万行代码的文件里面,都没办法打断点,也不能找到定义的地方,所以很难搞清楚是怎么一步步调过去的,也不知道为什么崩溃的,本来想把这个文件分解了,但后来发现,里面有很多的if endif,导致非常的不好分割,用source insight来看,也不好找,看来对工具的使用,还有待提高。

后来不用网上的办法了,改成用其他公司的代码(以前都不愿意用,因为都不知道从哪看,都没有个工程,还分成了好几个文件夹,也看不出来主程序在哪,后来发现了有个文档里面像是介绍该代码的,我在写文档的时候,都是用word或txt,这人用的pdf,我还以为是onvif官网上发的呢),直接拷贝过去,简单的修改了一下,就可以编译过了,但是还是有问题,同样是一编译就崩溃,调了好半天,后来发现,我直接return ok的时候就不崩溃了,说明是我填充的那段代码里面有问题,再后来叫了个高手帮我看了看,他说应该是内存分配上出了问题,我就把soap_malloc换成了soap_new_class,因为我看的代码都是c写的,都是用的struct,而我是用类的,但后来发现还是不行,后来我又改成了用new来分配内存,发现还是不行

最后发现,原来是申请空间出问题了,不知道为什么,别人的代码里面,都没有对最上层的对象申请空间,而是从第二层开始的,加上上层内存分配后,就不崩溃了,但是问题又来了

客户端收不到我发出的东西,总是没有能力信息。后来发现,我在发送的时候,填充的数据都已经没有了,也不知道为什么,申请的空间竟然被回收了,可是网上明明写着,会在调用soap_free等操作的时候,才会释放空间的啊,百思不得其解啊。

现在我还没有找到为什么空间被释放的问题,但是别人的空间就没有被释放掉啊,为什么我的就被释放了呢,肯定是我的某个地方出了问题。