我想与 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
重新连接到池)