Question

Je suis en train d'accéder 61616 dans mon application iPhone et le code SCReachability indique que j'ai un réseau valide, mais je Time out essayer d'écrire à 61616. Est-ce que quelqu'un sait:

A. Si le réseau iPhone EDGE / 3G dispose d'une plage de ports limité ou ne peut pas se connecter à ce port?

B. Comment puis-je vérifier explicitement l'accès à ce port. Voici mon « est le réseau accessible » code (emprunté à des exemples d'Apple), qui vérifie « foo.bar.com », mais ne montre pas comment vérifier « foo.bar.com:61616 ».

Toute aide est appréciée!

- (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;

}

Était-ce utile?

La solution

L'API SCNetworkReachability vérifie uniquement si l'adresse peut être acheminé vers. Citant la documentation:

  

« joignabilité » indique si une donnée   paquet envoyé par une application dans   la pile de réseau, peut quitter la locale   ordinateur. Notez que le fait joignabilité   ne garantit pas que le paquet de données   seront effectivement reçus par l'hôte.

Cela n'a rien à voir avec NAT ou restrictions de port. Le routage est basé sur les adresses - et non sur les ports. Donc, tout ce que vous pouvez trouver (via l'API SCNetworkReachability) est de savoir si vous pouvez (en théorie) atteindre l'interface de la machine. Il ne cherche pas à établir une connexion sur un certain port.

Ainsi, afin de savoir si ce service est accessible, vous devrez essayer de vous tester. De préférence, lorsque l'API SCNetworkReachability vous dit que peut établir une connexion. Juste essayer de se connecter au serveur sur le port 61616 et voir si vous obtenez une connexion ou un délai d'attente. Les valeurs de délai d'attente et de manipulation est cruciale ici.

Autres conseils

Ceci est quelque chose qui varie beaucoup non seulement de transporteur à mais d'un contrat à. Par exemple, ici au Royaume-Uni O2 restreindre l'accès Internet uniquement aux adresses Web (probablement ports 80 et 443, mais je n'ai pas vérifié) pour pay-as-you-go clients, mais permettent plus ou moins libre accès pour les personnes sur un Contrat. (J'espère que c'est un peu plus ouvert pour les clients iPhone PAYG.)

Je pense que le résultat pratique de ceci est que vous ne pouvez pas supposer l'accès aux ports élevés partout dans le monde.

Je ne suis pas sûr qu'il ya un moyen simple de vérifier qu'un port particulier est ouvert, probablement votre meilleure option est d'utiliser un délai « raisonnable ». Bien sûr, il y a un certain nombre de raisons pour lesquelles vous pourriez obtenir le délai d'attente pour que votre erreur devrait être appropriée vague.

Si votre iPhone est connecté via EDGE / Mobile, il est peut-être derrière une passerelle NAT donc vous être incapable de le contacter. Au moins c'est le cas avec T-Mobile Allemagne. L'iPhone obtient une adresse IP RFC par T-Mobile (172.16.x.x).

Je le tester avec l'iPhone connecté à votre réseau WiFi local et - si possible - généralement concevoir l'application d'une manière que les contacts de l'iPhone un serveur et le serveur peut communiquer avec le téléphone

.

Vous essayez de contacter votre iPhone à partir d'une machine externe?

Cela ne fonctionne pas probablement. Habituellement, le GPRS / EDGE / UMTS blocs d'infrastructure de connexions entrantes. Sinon, un abonné mobile pourrait être facturé pour le trafic non désiré, il n'a pas demandé. (Imaginez quelqu'un pinger votre iPhone une fois par seconde pour les six prochaines semaines. Vous paierez pour ça ...)

La solution est d'établir une connexion entre l'appareil mobile à la machine à distance, puis laisser la machine distante utiliser pour le trafic.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top