Диапазон сетевых портов iPhone EDGE / 3G? Кто-нибудь знает? - PullRequest
1 голос
/ 12 февраля 2009

Я пытаюсь получить доступ к 61616 в своем приложении для iPhone, и код SCReachability указывает, что у меня есть действующая сеть, но я пытаюсь записать в 61616 тайм-аут.

A. Если сеть iPhone EDGE / 3G имеет ограниченный диапазон портов или не может подключиться к этому порту?

B. Как я могу проверить явно для доступа к этому порту. Вот мой код «доступен для сети» (заимствован из примеров Apple), который проверяет наличие «foo.bar.com», но не показывает, как проверить наличие «foo.bar.com:61616".

Любая помощь приветствуется!

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

}

Ответы [ 4 ]

5 голосов
/ 17 февраля 2009

SCNetworkReachability API только проверяет, может ли адрес быть направлен на. Цитирование документации:

«Достижимость» отражает, являются ли данные пакет, отправленный приложением в сетевой стек, можно оставить локальный компьютер. Обратите внимание, что достижимость делает не гарантирует, что пакет данных будет фактически получено хостом.

Это не имеет ничего общего с NAT или ограничениями портов. Маршрутизация основана на адресах, а не на портах. Таким образом, все, что вы можете выяснить (через SCNetworkReachability API), - можете ли вы (теоретически) добраться до интерфейса машины. Он не пытается установить соединение по определенному порту.

Таким образом, чтобы узнать, доступна ли эта услуга, вам нужно попробовать и проверить себя. Предпочтительно, когда API SCNetworkReachability сообщает вам, что соединение может быть установлено. Просто попробуйте подключиться к серверу через порт 61616 и посмотреть, получите ли вы соединение или время ожидания. Правильные значения тайм-аута и обработка имеют решающее значение здесь.

2 голосов
/ 15 февраля 2009

Это то, что сильно различается не только от перевозчика к перевозчику, но от контракта к контракту. Например, здесь, в Великобритании, O2 ограничивает доступ в Интернет только к веб-адресам (предположительно, порты 80 и 443, но я не проверял) для клиентов с оплатой по факту, но разрешает более или менее бесплатный доступ для пользователей контракт. (Я надеюсь, что он будет немного более открытым для клиентов iPhone PAYG.)

Я думаю, что практическим результатом этого является то, что вы не можете получить доступ к высоким портам во всем мире.

Я не уверен, что есть простой способ проверить, открыт ли определенный порт, вероятно, ваш лучший вариант - использовать «разумный» тайм-аут. Конечно, есть ряд причин, по которым вы можете получить тайм-аут, поэтому ваша ошибка должна быть достаточно расплывчатой.

1 голос
/ 12 февраля 2009

Если ваш iPhone подключен через EDGE / Mobile, он может находиться за шлюзом NAT, поэтому вы не можете связаться с ним. По крайней мере, так обстоит дело с T-Mobile в Германии. IPhone получает IP-адрес RFC от T-Mobile (172.16.x.x).

Я бы протестировал его с iPhone, подключенным к локальной сети Wi-Fi, и, если возможно, обычно проектировал приложение так, чтобы iPhone связывался с сервером, а затем сервер мог общаться с телефоном.

0 голосов
/ 20 февраля 2009

Вы пытаетесь связаться со своим iPhone с внешнего устройства?

Это, вероятно, не работает. Обычно инфраструктура GPRS / EDGE / UMTS блокирует входящие соединения. В противном случае абоненту мобильной связи может быть выставлен счет за нежелательный трафик, который он не запрашивал. (Представьте, что кто-то пингует ваш iPhone один раз в секунду в течение следующих шести недель. Вы бы заплатили за это ...)

Решение состоит в том, чтобы установить соединение с мобильного устройства на удаленный компьютер, а затем разрешить удаленному компьютеру использовать его для трафика.

...