Использование GSoap возвращает EHOSTUNREACH при вызове connect () через socket.h - PullRequest
1 голос
/ 11 августа 2010

В настоящее время я создаю приложение для iPhone на основе Gsoap инструментария для подключения к веб-сервису. Все работает нормально, за исключением случаев, когда я пытаюсь подключиться к своему сервису после отключения и повторного подключения 3g на устройстве, я получаю:

SOAP 1.1 fault: SOAP-ENV:Client [no subcode]
"Connection refused"
Detail: connect failed in tcp_connect()

Работа через отладчик показывает, что ошибка происходит от connect() метода socket.h. Я не очень понимаю, когда я запускаю другое приложение, такое как Safari, устройство подключается к Интернету. И после загрузки веб-страницы, соединение моего приложения работает нормально.

Вот код, который я использую:

//GSoap initialization
    struct soap soap; 
    soap_init(&soap);
    soap.connect_timeout = 0;  
    soap.send_timeout = 0; 
    soap.recv_timeout = 0;


// objects request & response
// struct types can be foundin soapStub.h
struct _ns1__GetAuthentification requete;
struct _ns1__GetAuthentificationResponse reponse;

// init request
requete.ConnectPass = (char *) [connectPass UTF8String];
requete.Login = (char *) [login UTF8String];
requete.Password = (char *) [password UTF8String];
requete.soap = &soap;

// request callback. returns SOAP_OK if something has been returned
if(soap_call___ns1__GetAuthentification(&soap,NULL,NULL, &requete,&reponse) == SOAP_OK){

    //then we build the result
    NSLog(@"Yay!");

    soap_end(&soap); // remove deserialized data and clean up
    soap_done(&soap); // detach the gSOAP environment

    return authResult;

}
else {

    //NSLog(@"Soap Error : GetAuthentification");
    // We try to see if there's any problem. @catch statements are here just to keep note of the concerned
    // exceptions for each request. No utility for the code.
    @try {
        [self processFault:&soap];
    }
    @catch (MMWrongId * e) {
        @throw e;
    }
    @catch (MMConnectionFailed * e) {
        @throw e;
    }
    @catch (MMGetAuthentificationFault * e) {
        @throw e;
    }


    return nil;
}

Мне не хватает какого-то определенного флага / опции?

1 Ответ

1 голос
/ 11 августа 2010

Для тех, кто сталкивается с той же проблемой, у меня есть решение. Майкл Ласманис очень помог в этом. Вот его ответ:

это одна из причин, по которой я больше не рекомендую gsoap для новых разработчиков для iphone. gsoap использует нижние сокеты bsd и обходит более высокий уровень iphone apis. Именно API-интерфейсы более высокого уровня управляют состоянием интернет-соединения, поэтому, если вы сначала запустите Safari, то все работает. самый простой обходной путь - использовать nsurlconnection, чтобы открыть http-соединение с хорошо известным сайтом перед вызовом gsoap.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...