Domanda

Sto cercando di accedere a 61616 nel mio iPhone app e il codice SCReachability indica che ho una rete valida, ma il tempo nel tentativo di scrivere a 61616. Qualcuno sa:

A. Se la rete iPhone EDGE / 3G ha un intervallo di porte limitato o non è consentito per la connessione a questa porta?

B. Come posso controllare in modo esplicito per l'accesso a questa porta. Qui è il mio "è la rete raggiungibile" il codice (preso in prestito da esempi di Apple), che verifica la presenza di "foo.bar.com", ma non mostra come controllare per "foo.bar.com:61616".

Ogni aiuto è apprezzato!

- (BOOL)isDataSourceAvailable{
static BOOL checkNetwork = YES;
BOOL _isDataSourceAvailable = NO;
if (checkNetwork) { // Since checking the reachability of a host can be expensive, cache the result and perform the reachability check once.
    checkNetwork = NO;

    Boolean success;    
    const char *host_name = "foo.bar.com";

    SCNetworkReachabilityRef reachability = SCNetworkReachabilityCreateWithName(NULL, host_name);
    SCNetworkReachabilityFlags flags;
    success = SCNetworkReachabilityGetFlags(reachability, &flags);
    _isDataSourceAvailable = success && (flags & kSCNetworkFlagsReachable) && !(flags & kSCNetworkFlagsConnectionRequired);
    CFRelease(reachability);
}
return _isDataSourceAvailable;

}

È stato utile?

Soluzione

L'API SCNetworkReachability controlla solo se l'indirizzo può essere indirizzato a. Citando la documentazione:

  

"raggiungibilità" riflette sia un data   pacchetto inviato da un'applicazione in   lo stack di rete, può lasciare il locale   computer. Si noti che la raggiungibilità fa   non garantisce che il pacchetto di dati   saranno effettivamente ricevuti da parte dell'ospite.

Questo non ha nulla a che fare con NAT o restrizioni di porta. Routing si basa sugli indirizzi - non sulle porte. Quindi tutto è possibile scoprire (via SCNetworkReachability API) è se si potrebbe (in teoria) di raggiungere l'interfaccia della macchina. Essa non cerca di stabilire una connessione su una determinata porta.

Quindi, al fine di scoprire se che il servizio è raggiungibile dovrete provare e testare voi stessi. Preferibilmente quando l'API SCNetworkReachability vi dice che una connessione può essere stabilita. Basta provare a connettersi al server sulla porta 61616 e vedere se si ottiene una connessione o un timeout. valori di timeout corretta e la manipolazione è fondamentale qui.

Altri suggerimenti

Questo è qualcosa che varia molto da non solo vettore a vettore, ma da contratto a contratto. Ad esempio, qui nel Regno Unito O2 limitare l'accesso a Internet solo a indirizzi web (presumibilmente porte 80 e 443, ma non ho controllato) per la pay-as-you-go clienti, ma consente l'accesso più o meno libero per le persone in un contrarre. (Mi auguro che sia un po 'più aperto per i clienti iPhone PAYG.)

Credo che il risultato pratico di questo è che non si può assumere l'accesso alle alte porti in tutto il mondo.

Non sono sicuro che ci sia un modo semplice per verificare che una particolare porta è aperta, probabilmente l'opzione migliore è quella di utilizzare un timeout "ragionevole". Naturalmente, ci sono una serie di motivi si potrebbe ottenere il timeout in modo da l'errore dovrebbe essere adatto vago.

Se il vostro iPhone è connesso tramite EDGE / mobile, potrebbe essere dietro un gateway NAT così di essere in grado di contattarlo. Almeno questo è il caso di T-Mobile in Germania. L'iPhone ottiene un indirizzo IP RFC da T-Mobile (172.16.x.x).

Vorrei provarlo con l'iPhone collegato alla rete Wi-Fi locale e - se possibile - in generale progettare l'applicazione in modo che i contatti iPhone un server e quindi il server in grado di comunicare con il telefono

.

Stai cercando di contattare il vostro iPhone da una macchina esterna?

Che probabilmente non funziona. Di solito i GPRS / EDGE / UMTS blocchi infrastrutture connessioni in entrata. In caso contrario, un abbonato mobile potrebbe essere fatturata per il traffico indesiderato che non ha richiesto. (Immaginate che qualcuno il ping il vostro iPhone una volta al secondo per le prossime sei settimane. Si potrebbe pagare per questo ...)

soluzione è stabilire una connessione dal dispositivo mobile al computer remoto e poi lasciare la macchina remota utilizzare quello del traffico.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top