2011-07-03 53 views
0

類似的問題已被問到,但問題似乎是非常具體的代碼,所以希望這是好的。iOS - CFSocket沒有得到回調

我正在嘗試編寫一個偵聽UDP廣播並對數據執行操作的iOS應用程序。更高級的實現似乎建議使用後臺線程和原始套接字來實現這種功能,但我認爲這是第一次嘗試使用CFSocket來保持簡單。我已經研究了Apple的UDPEcho示例,但已經遇到了困難。

我將CFSocket添加到RunLoop,但我的回調永遠不會被調用。像這種類型的代碼一樣,這很難調試。我使用了很多UDPEcho中建議的錯誤檢查,並且一切正常。這裏是代碼:

我有一個名爲DataListener的對象管理連接。這是的DataListener的init(與檢查刪除錯誤:

int sock; 
int err; 
CFRunLoopSourceRef rls; 
const CFSocketContext context = { 0, self, NULL, NULL, NULL }; 

sock = socket(AF_INET, SOCK_DGRAM, 0); 

# Setup address struct and bind to socket for broadcast 
struct sockaddr_in addr; 
memset(&addr, 0, sizeof(addr)); 
addr.sin_len = sizeof(addr); 
addr.sin_family = AF_INET; 
addr.sin_port = 51234; 
addr.sin_addr.s_addr = INADDR_ANY; 
err = bind(sock, (const struct sockaddr *) &addr, sizeof(addr)); 

# Set flags to non-blocking 
int flags; 
flags = fcntl(sock,F_GETFL); 
err = fcntl(sock, F_SETFL, flags | O_NONBLOCK); 

# CFSocket is created, stored in the object 
self->_cfSocket = CFSocketCreateWithNative(NULL,sock,kCFSocketReadCallBack, 
              SocketReadCallback, &context); 
sock = -1; 
# CFSocket is added to the Main RunLoop 
rls = CFSocketCreateRunLoopSource(NULL,self->_cfSocket,0); 
CFRunLoopAddSource(CFRunLoopGetCurrent(), rls, kCFRunLoopDefaultMode); 
CFRelease(rls); 

此功能是爲了生成C回調(此功能不會被調用如預期):

static void SocketReadCallback(CFSocketRef s, CFSocketCallBackType type, CFDataRef address, const void *data, void *info){ 
    DataListener* obj; 
    obj = (DataListener*) info; 
    NSLog(@"Got callback in C"); 
    [obj readData]; 
} 

的的DataListener READDATA功能是一個OBJ-C功能,然後處理數據。

有什麼錯我的設置碼?有沒有一種方法來驗證CFSocket被提上RunLoop正確?

謝謝您閱讀材料的任何提示或建議。我意識到將來我應該使用一個線程,但在這個例子中,我想弄清楚如何用CFSocket做到這一點。

更新:從未弄清楚這裏出了什麼問題。移動到asyncsocket:http://code.google.com/p/cocoaasyncsocket/和生活是好的。

回答

1

嘗試更換CFRunLoopGetCurrent()來CFRunLoopGetMain()