類似的問題已被問到,但問題似乎是非常具體的代碼,所以希望這是好的。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/和生活是好的。