pool.ntp.org に接続して時刻を同期したい。だからソケットを作成しています
sock=CFSocketCreate(NULL, PF_INET, SOCK_DGRAM, IPPROTO_UDP, kCFSocketDataCallBack|kCFSocketWriteCallBack|kCFSocketConnectCallBack, sockCallback, &sock_ctx);
次に、ループを設定しています
sockref=CFSocketCreateRunLoopSource(NULL, sock, 0);
CFRunLoopAddSource(CFRunLoopGetMain(), sockref, kCFRunLoopCommonModes);
アドレスに接続する
CFDataRef adrref=CFDataCreate(NULL, (const UInt8 *)&adr, sizeof(adr));
CFSocketError err=CFSocketConnectToAddress(sock, adrref,-1);
コールバック kCFSocketWriteCallBack がある場合、必要なデータを送信します
CFDataRef bufref=CFDataCreate(NULL, buffer, scl->NTP_PACKET_SIZE);
CFSocketError error = CFSocketSendData(scl->sock, NULL, bufref,3);
ここまでのすべてが完璧に機能します。私の実際の問題は
else if(callbackType==kCFSocketDataCallBack)
9/10回は問題なく動作しています。サーバーが応答を送信し、プロセスが続行されます。問題は、データが実際にアプリのロジックを継続するのを待っていることです。データが来ない場合kCFSocketDataCallBack
はトリガーされず、アプリは永遠に待機します。データの受信を待機するときにタイムアウトを設定する方法はありますか?(自分でNSTimer
プールに再接続する必要はありません)