使用gSoap的异步、确认、点对点连接

Asynchronous, acknowledged, point-to-point connection using gSoap

本文关键字:确认 点对点连接 异步 gSoap 使用      更新时间:2023-10-16

我的情况如下:

  1. 我有一个wsdl,"翻译"成这样的头文件:wsdl2h -o file.h file.wsdl
  2. 然后,执行soapcpp2 -Icorrect_path -j file.h 在"服务器端"上,我使用soapXXXService.[h|cpp] 实现了该服务。
  3. 在"服务器端"再次,我使用soap_init2(与SOAP_IO_KEEPALIVE),我有soap_bind, soap_accept, soap_copy等,它似乎工作得很好(见下文)
  4. 在"客户端",我使用生成的proxy对象(再次使用SOAP_IO_KEEPALIVE),构造消息并将其发送到服务器
  5. "服务器"接收此消息并发回ACK(自定义XML)
  6. "客户端"收到ACK,一切都很好。

所以,我现在要做的是让"服务器"返回"real"响应到"客户端","客户端"必须返回一个ACK到"服务器"。

这怎么可能?(应该是)


"你试过什么?"

我想起了两件事。

第一个是以某种方式重用套接字的文件描述符,从soap_accept返回,将"真实响应"发送回服务器。但这可能吗?
Unix套接字是全双工的,所以这在技术上是可能的,但是gSoap限制这一点吗?因为我在文档中没有看到任何关于这个的内容。

第二个选项,我想到的是在"客户端"中创建相同的"服务",以便有可能接收消息("真实响应")并以与"服务器"相同的方式返回ACK。但这意味着,"服务器"必须也有一个proxy对象的实例,以便能够发送这个所谓的"真实响应"。对我来说,这听起来真的很丑陋和可怕。如果这是唯一的选择,我不会感到惊讶,但是……

编辑:对于第二个选项-这意味着,客户端应该有一个侦听器端口,应该处理传入的连接,等等。听起来不像客户…


我明白,我可能错过了gSoap如何工作的一些基本部分,但我阅读了整个用户文档和"入门"指南,我没有找到任何关于这一点的内容。

如果有什么不清楚的地方请告诉我


EDIT:这是我想要实现的场景:

  1. 客户端发送请求到服务器
  2. 服务器返回ACK作为响应(与标准ACK一样)-信号成功接收请求
  3. 之后,服务器发送响应给客户端(这是真正的响应)
  4. 客户端返回ACK再次-信号成功接收到响应

这个场景也可以是相反的方向:服务器也可以向客户端发送请求。这将意味着-与上面相同的场景,但替换"客户端" <-> "服务器"。

注意: request/response ACK SOAP消息。

我在我的问题中使用option 2实现了它。即:在客户端和服务器中实现服务(侦听器)并使用代理(用于发送请求)。这样,我就有了以下内容:

  1. 服务器已启动
  2. 客户端启动(启动一个侦听器,即:"服务")
  3. 客户端发送SOAP请求(使用代理对象),告诉服务器:"我起来了,我的位置是xxx" (xxx是URI,它将用于连接服务器到客户端的监听器)
  4. 服务器响应SOAP消息(ACK)(说:"OK, I see you're up now")
  5. 之后,服务器发送SOAP请求(通过代理对象)到客户端,使用在第一个消息中接收到的位置;此请求是3.中发送的请求的真实响应,这表示- "OK, I'm ready to communication with you"
  6. 客户端返回响应到这个请求(ACK)(说:"OK, cool")

这样,客户端和服务器都知道对方的位置,都有侦听器(服务的实现),维护代理对象。


似乎这对我有用。如果有人给我另一个选择,或者在我的问题中说一些关于option 1的事情,我会很高兴的。


编辑:经过几天的深入研究和对协议的深入分析,我打算实现,看来,这是唯一的方法:

实现必须能够同时作为SOAP客户端和SOAP服务器