我在通過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?。
有沒有這個工作? – 2010-11-09 23:09:14