使用gSoap进行异步,已确认的点对点连接

Kir*_*rov 9 c c++ unix linux gsoap

这是我的情况:

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

所以,我现在要做的是让"服务器"返回"真实"响应"客户端","客户端"必须返回ACK"服务器".

这怎么可能?(它应该是)


"你试过什么?"

我想到了两件事.

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

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

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


我明白,我可能会遗漏一些有用的基本部分gSoap,但我阅读了整个用户文档"入门"指南,但我没有找到任何相关信息.

如果不清楚,请告诉我


编辑:这是我希望实现的方案:

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

这种情况也可能是相反的方向:服务器也可以向客户端发送请求.这意味着 - 与上面相同的情况,但更换"客户端"< - >"服务器".

注意:both request/responseARE SOAP消息.ACK

Kir*_*rov 2

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

  1. 服务器已启动
  2. 客户启动(启动侦听器,又名“服务”)
  3. 客户发送SOAP请求(使用代理对象),告诉服务器:“我起来了,我的位置是 xxx”xxx是 URI,它将用于将服务器连接到客户端的侦听器)
  4. 服务器用SOAP消息 (ACK) 进行响应(说:好的,我看到你现在已经起来了”
  5. 随后,服务器使用第一条消息中收到的位置向客户端发送SOAP 请求(通过代理对象);该请求是该请求的真实响应,发送的内容3.是:“好的,我已准备好与您沟通”
  6. 客户返回对此请求的响应(ACK)(说: “好的,酷”

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


看来这对我有用。option 1如果有人给我另一个选择或在我的问题中说些什么,我会很高兴。


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

实现必须能够充当 SOAP 客户端和 SOAP 服务器