Несколько одновременных клиентов с gsoap - PullRequest
0 голосов
/ 21 декабря 2011

Я пытаюсь включить множественный одновременный доступ клиентов к веб-сервису, позволяя клиенту сделать запрос и заблокировать, пока данные не станут доступны (я делаю это таким образом, поскольку gsoap не поддерживает уведомления)

Мой класс веб-сервиса скомпилирован с WITH_PURE_VIRTAL, что означает, что я не могу создавать его экземпляры, так как это абстрактный класс. Таким образом, я использую один созданный мной класс, который наследуется от класса webservice и отвечает за управление запросами webservice и webclient.

Однако, когда мой класс занят обработкой существующего клиента, я не могу получать другие запросы.

Я прочитал ( здесь ), что вы должны запустить поток с чем-то похожим на это:

   soap_serve((struct soap*)soap);
   soap_destroy((struct soap*)soap); // dealloc C++ data
   soap_end((struct soap*)soap); // dealloc data and clean up
   soap_done((struct soap*)soap); // detach soap struct
   free(soap); 

Однако, когда я изменяю этот код для вызова своего класса веб-сервиса, вызов обслуживания ничего не делает.

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

У кого-нибудь есть предложения?

1 Ответ

1 голос
/ 21 декабря 2011

Если вы посмотрите на мой ответ на этот вопрос, вы увидите очень простой C ++ многопоточный сервер gSoap. Я думаю, что вы можете упустить необходимость скопировать класс сервиса, в моем коде строка tc = c.copy() ; // make a safe copy, которая копирует экземпляр сервиса gSoap, включая контекст gSoap; именно эта копия передается в новый поток, чтобы новый поток мог ответить на запрос, пока основной поток ожидает выполнения другого запроса.

...