Диапазон сетевых портов iPhone EDGE/3G?Кто-нибудь знает?

StackOverflow https://stackoverflow.com/questions/539284

Вопрос

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

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

Б.Как я могу явно проверить доступ к этому порту.Вот мой код «доступна ли сеть» (заимствованный из примеров 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;

}

Это было полезно?

Решение

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

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

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

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

Другие советы

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

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

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

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

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

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

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top