У нас есть приложение для Android, которое использует мыло для связи с API, реализованным на C ++ с помощью gsoap. Приложение для Android использует библиотеку ksoap2-android для мыльной связи.
Когда приложение для Android работает на реальном устройстве и общается через Wi-Fi, кажется, все работает как надо. Однако при запуске в эмуляторе (виртуализированном образе x86) запросы с более длинными ответами часто завершаются неудачей с неожиданным завершением потока ProtocolException.
Эта ошибка и то, что она имеет место только при длинных ответах, позволяет мне полагать, что на стороне gsoap сокет скоро закрывается. Я попробовал кое-что.
Поскольку сон не является хорошим решением, я использовал 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;
}
Это правильное решение?
Задача ещё не решена.
Других решений пока нет …