2010-07-25 25 views
5

我在通過3G從iPhone發送UDP數據包時遇到了一個奇怪的問題。幾乎每次我的應用程序在更長時間的網絡不活動之後啓動(例如在手機來自睡眠模式或剛獲得3G連接之後),我的應用程序就無法發送任何UDP數據包。我從CFSocketSendData得到kCFSocketError錯誤狀態。然後應用程序邏輯重新嘗試每隔5秒週期發送一次數據包,但無論我讓它運行多長時間它都會保持失敗。但是,當我將應用程序切換到背景並打開例如Safari中的網頁時(應用程序仍然在後臺失敗),應用程序突然開始工作。基本上,其他網絡活動(來自Safari,Maps等)似乎「真正開啓了網絡」。我是否需要在網絡初始化方面做任何特殊的事情?在iPhone上發送UDP數據包通過一個新的3G連接失敗,但工作不正常

這是我用來發送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,Maps,...)中有時(但非常偶然)也會看到相同的行爲。有時候他們拒絕連接(甚至認爲我看到3G圖標),我需要關閉並重新打開它們。但這非常罕見。

編輯:可能相關的問題:On iPhone, what does EPERM (errno == 1) mean in reponse to send() of UDP data?

+0

有沒有這個工作? – 2010-11-09 23:09:14

回答

4

在操作系統的樂趣下,3G TCP/IP網絡接口可以被IOS拆除,通常出於省電原因,如果沒有流量通過它。當使用BSD套接字(例如,對於UDP,由於沒有UDP蘋果網絡框架),沒有公佈OS操作調用來確保3G網絡接口處於啓動狀態。但在Apple的CFSocketStream類內部,存在喚醒界面的私人Apple調用。

所以解決方案似乎是打開一個CFSocketStream到某個地方。這將喚醒界面一段時間。只要您一分鐘左右通過CFSocketStream發送數據,連接和網絡接口就會保持不變。

這並不是那麼有吸引力,因爲它只是在副作用下工作。但它似乎是目前唯一的解決方案。

相關問題