Неожиданный конец потока ksoap2-android с gsoap

У нас есть приложение для Android, которое использует мыло для связи с API, реализованным на C ++ с помощью gsoap. Приложение для Android использует библиотеку ksoap2-android для мыльной связи.

Когда приложение для Android работает на реальном устройстве и общается через Wi-Fi, кажется, все работает как надо. Однако при запуске в эмуляторе (виртуализированном образе x86) запросы с более длинными ответами часто завершаются неудачей с неожиданным завершением потока ProtocolException.

Эта ошибка и то, что она имеет место только при длинных ответах, позволяет мне полагать, что на стороне gsoap сокет скоро закрывается. Я попробовал кое-что.

  • флажки по умолчанию accept_flags на стороне gsoap не работали
  • явное удаление флагов SO_LINGER из accept_flags в gsoap не решило проблему (я боялся, что это может привести к задержке с нулевым тайм-аутом, что приведет именно к моей проблеме)
  • явно указать флаг SO_LINGER в флагах принятия и тайм-аут 10, не решил проблему
  • Затем я попытался добавить сон на 1 секунду прямо перед выключением в функции gsoaps tcp_disconnect. Это решило проблему, но сон бесполезен.

Поскольку сон не является хорошим решением, я использовал select, который, кажется, работает нормально, но я не уверен на 100% в этом решении.

Вот фактическое изменение кода. Это последние строки функции tcp_disconnect в stdsoap2.cpp. Вызов tcp_select — это то, что я добавил.

    if (soap_valid_socket(soap->socket) && !(soap->omode & SOAP_IO_UDP))
{
tcp_select(soap, soap->socket, SOAP_TCP_SELECT_RCV | SOAP_TCP_SELECT_ERR, 5);
soap->fshutdownsocket(soap, soap->socket, SOAP_SHUT_RDWR);
soap->fclosesocket(soap, soap->socket);
soap->socket = SOAP_INVALID_SOCKET;
}
return SOAP_OK;
}

Это правильное решение?

1

Решение

Задача ещё не решена.

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

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

По вопросам рекламы ammmcru@yandex.ru
Adblock
detector