Chcę połączyć się z pool.ntp.org do synchronizacji czasu. Więc tworzę gniazdoCzas oczekiwania na odebranie danych przez IOS CFsocket
sock=CFSocketCreate(NULL, PF_INET, SOCK_DGRAM, IPPROTO_UDP, kCFSocketDataCallBack|kCFSocketWriteCallBack|kCFSocketConnectCallBack, sockCallback, &sock_ctx);
następnie am utworzenie pętli
sockref=CFSocketCreateRunLoopSource(NULL, sock, 0);
CFRunLoopAddSource(CFRunLoopGetMain(), sockref, kCFRunLoopCommonModes);
i podłączenie do adresu
CFDataRef adrref=CFDataCreate(NULL, (const UInt8 *)&adr, sizeof(adr));
CFSocketError err=CFSocketConnectToAddress(sock, adrref,-1);
jeśli mam callback kCFSocketWriteCallBack i przesłać wymagane dane
CFDataRef bufref=CFDataCreate(NULL, buffer, scl->NTP_PACKET_SIZE);
CFSocketError error = CFSocketSendData(scl->sock, NULL, bufref,3);
wszystko, aż tutaj działa idealnie. Mój prawdziwy problem jest pod
else if(callbackType==kCFSocketDataCallBack)
9/10 razy działa dobrze. serwer wysyła odpowiedź i mój proces jest kontynuowany. Problem polega na tym, że czekam na rzeczywiste dane, aby kontynuować moją logikę aplikacji. jeśli nie ma danych, kCFSocketDataCallBack
nie jest wywoływane, a aplikacja czeka na zawsze. Czy jest jakiś sposób, aby ustawić limit czasu na oczekiwanie na otrzymanie danych? (Bez posiadania przez siebie NSTimer
, aby ponownie połączyć się z pulą)
Mam ten sam problem, czy znalazłeś jakieś rozwiązanie? – xjdrew