Отправка пакетов UDP на iPhone заменяет свежее новое соединение 3G, но работает иначе

У меня есть странная проблема при отправке пакетов UDP от iPhone по 3G. Почти каждый раз мое приложение запускается после более длительного периода сетевой неактивности (например после того, как телефон прибывает из режима ожидания, или это просто получает соединение 3G), мое приложение не может отправить любые пакеты UDP. Я получаю a kCFSocketError ошибочное состояние от CFSocketSendData. Прикладная логика затем повторяет для отправки пакета периодически каждые пять секунд, но неважно сколько времени я позволяю, это работать это продолжает перестать работать. Однако, когда я переключаю приложение на фон и открытый, например, веб-страница в Safari (в то время как приложение все еще перестало работать на фоне), приложение внезапно начинает работать. В основном кажется, что другая сетевая активность (от Safari, Карты и т.д.) "начинает сети для реального". Я должен сделать что-либо специальное с точки зрения сетевой инициализации, например?

Это - упрощенный отрывок кода, который я использую для отправки пакетов UDP:

CFSocketRef cfSocket = CFSocketCreate(NULL, 0, SOCK_DGRAM, IPPROTO_UDP, kCFSocketNoCallBack, NULL, NULL);
if (!cfSocket)
{
    // snip: some error handling
}

struct sockaddr_in addr;
// snip: init addr

CFDataRef cfAddr = CFDataCreate(NULL, (unsigned char *)&addr, sizeof(addr));

CFSocketError sendPacketResult = CFSocketSendData(cfSocket, cfAddr, cfPacketData, 0.0);
if (sendPacketResult != kCFSocketSuccess)
{
    // try again in 5 seconds
}

Все это хорошо работает без любых проблем по Wi-Fi.

Честно говоря, я думаю, что иногда видел (но достаточно редко) то же поведение в стандартных приложениях для iPhone (Safari, Карты...) также. Иногда они отказываются соединяться (даже думал, что я вижу значок 3G), и я должен закрыть и вновь открыть их. Но это очень редко.

Править: Возможно связанный вопрос: На iPhone, что делает EPERM (errno == 1) означают в reponse отправлять () данных UDP?.

5
задан Community 23 May 2017 в 11:57
поделиться