Асинхронное, подтвержденное соединение точка-точка с использованием gSoap

Вот моя ситуация:

  1. у меня есть wsdl«переведено» в заголовочный файл, например так: wsdl2h -o file.h file.wsdl
  2. Затем я выполнил soapcpp2 -Icorrect_path -j file.h
  3. На «серверной стороне» я реализовал сервис, используя soapXXXService.[h|cpp]
  4. На «стороне сервера» я снова использовал soap_init2SOAP_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 снова — сигнал успешно получен ответ

И этот сценарий может быть и в обратном направлении: сервер также может отправить запрос клиенту. Это будет означать — тот же сценарий, что и выше, но с заменой «клиента» <-> «сервер».

ПРИМЕЧАНИЕ: оба request/response а также ACK ЯВЛЯЮТСЯ SOAP сообщения.

9

Решение

Я реализовал это с помощью option 2 в моем вопросе. То есть: внедрить службу (слушатель) и использовать прокси (для отправки запросов) как на клиенте, так и на сервере. Таким образом, у меня есть следующее:

  1. сервер вверх
  2. клиент запускается (запускает слушатель, к.а. «сервис»)
  3. клиент посылает МЫЛО запрос (используя полномочие объект), сообщая серверу: «Я нахожусь и мое местоположение — ххх» (xxx это URI, который будет использоваться для подключения сервера к слушателю клиента)
  4. сервер ответы с МЫЛО сообщение (ACK) (говоря: «Хорошо, я вижу, что ты сейчас»)
  5. Позже сервер посылает SOAP запрос (с помощью полномочие объект) клиенту, используя местоположение, полученное в первом сообщении; этот запрос является реальным ответом на запрос, отправленный в 3. Это говорит — «Хорошо, я готов с тобой общаться»
  6. клиент возвращается ответ на этот запрос (ACK) (говоря: «Ладно, круто»)

И так, и клиент, и сервер знают местоположение друг друга, и то и другое иметь слушателя (внедрение сервиса), и то и другое поддерживать прокси-объекты.


Похоже, это будет работать для меня. Я был бы счастлив, если бы кто-нибудь дал мне другой вариант или сказал бы что-нибудь о option 1 в моем вопросе.


РЕДАКТИРОВАТЬ: После глубокого изучения в течение нескольких дней и после глубокого анализа протокола, я намеревался реализовать, оказалось, что это единственный способ сделать это:

Реализации ДОЛЖНЫ быть в состоянии функционировать как клиент SOAP, так и сервер SOAP.

2

Другие решения

Других решений пока нет …