2010-07-25 16 views
5

Bir 3G üzerinden bir iPhone üzerinden UDP paketleri gönderirken garip bir sorun yaşıyorum. Uygulamam hemen hemen her zaman ağ etkinsizliğinden (örneğin telefon uyku modundan geldikten sonra veya sadece 3G bağlantısı aldığında) başladıktan sonra, uyguladığım herhangi bir UDP paketi gönderemiyor. CFSocketSendData'dan kCFSocketError hata durumu alıyorum. Uygulama mantığı daha sonra paketini periyodik olarak her beş saniyede göndermek için yeniden dener, ancak ne kadar çalışmasına izin vermesem de başarısız oluyor. Ancak, uygulamayı arka plana açtığımda ve örneğin Safari'deki bir web sayfasını açtığımda (uygulama hala arka planda başarısız oluyorsa), uygulama aniden çalışmaya başlar. Temel olarak, diğer ağ aktivitesi (Safari, Haritalar vb.) "Ağ bağlantısını gerçek için başlatıyor" gibi görünüyor. Örneğin, ağ başlangıcı açısından özel bir şey yapmam gerekiyor mu? Tüm Wi-Fi üzerinden sorunsuz çalışıyoriPhone'da UDP paketleri yeni ve yeni bir 3G bağlantısı üzerinden gönderilemedi, ancak aksi halde çalışıyor

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 
} 

:

Bu benim UDP paketleri göndermek için kullanıyorum kod basitleştirilmiş snippet'tir.

Adil olmak gerekirse, bazen standart iPhone uygulamalarında (Safari, Maps, ...) aynı davranışı bazen (ama bazen) gördüm. Bazen bağlamayı reddediyorlar (3G ikonunu bile gördüğümü bile düşündüm) ve bunları kapatıp tekrar açmam gerekiyor. Ama bu çok nadir.

Düzeltme: Muhtemelen ilgili soru: On iPhone, what does EPERM (errno == 1) mean in reponse to send() of UDP data?.

+0

Hiç işe yarayın mı? –

cevap

4

3G TCP/IP ağ arabirimi, işletim sisteminin genelindeki IOS tarafından, genel olarak, trafiğe neden olmazsa güç tasarrufu nedenleriyle, kullanımdan kaldırılabilir. BSD soketlerini kullanırken (örneğin, UDP için Apple UDP ağı olmadığı için) 3G ağ arayüzünün dolmasını sağlamak için yayınlanmış bir işletim sistemi yoktur. Fakat Apple'ın CFSocketStream sınıfında dahili olarak, arayüzü uyandıran özel Apple çağrıları var. Böylece çözüm bir yere bir CFSocketStream açmak gibi görünüyor. Bu, bir süre için arayüzü uyandıracak. CFSocketStream üzerinden bir dakikadan fazla veri gönderdiyseniz, bağlantı ve ağ arabirimi kalkar.

Bu sadece bu kadar çekici değil çünkü sadece yan etkiyle çalışıyor. Ama bu noktada tek çözüm gibi görünüyor.

İlgili konular