2011-10-03 26 views
8

iPhone'dan bir UDP yayını göndermem ve ardından bir zaman aşımı süresiyle UDP yanıtı dinlemem gerekiyor. Apple'ın UDPEcho example'u buldum ama ihtiyacım olan şey olup olmadığından emin değilim. Ayrıca göndermek, ancak almak için this example bulundu.iPhone UDP yayını ve yanıtı

//send the broadcast 
SendUDP("255.255.255.255", targetPort, myData); 
//A blocking call to get the data. Timeout value will be short, 2 seconds at most 
//An asynchronous option is ok, if it's necessary. 
Response = GetFirstUDPResponse(receptionPort, timeoutValue); 

//process the response 
if(Response == null) 
    //we timed out 
else 
    //process response 

ben tekerleği yeniden icat gerekmez, basit bir çözüm için umut ediyorum: Temelde, böyle basit bir şey yapmak gerekir. Bunu uygulamak için en iyi stratejiyle ilgili her türlü tavsiyeyi takdir ediyorum!

cevap

5

Apple yerel sınıflardan daha kolay olan cocoaAsyncSocket'u kullanabilirsiniz.
AsyncUdpSocket sınıfı ile UDP'yi destekler.

AsyncUdpSocket CFSocket sarar UDP/IP soket ağ kütüphanesidir. Neredeyse tamamen TCP sürümü gibi çalışır, ancak UDP için özel olarak tasarlanmış . Bu sıraya içerir engellenmeyen gönderme/alma işlemleri, IPv4 ve IPv6

kullanıyorum başka bir iş parçacığı üzerinde 'recvfrom' koyardım
+0

Teşekkürler, kolaydı. Kodumun çoğunu burada sağladım: http://stackoverflow.com/questions/5790149/little-problem-with-asyncudpsocket-receiving-data-after-connecting-to-broadcast-i/7682688#7682688 – Alex

5

tam temsilci desteği, çalışma döngü tabanlı, müstakil sınıf ve destek Bu gibi büyük merkezi sevkıyat:

// Use grand central dispatch so we don't block the interface 
dispatch_async(dispatch_get_global_queue(0, 0), ^{ 

    recvfrom(...) // Receive with a 2s timeout 

    dispatch_async(dispatch_get_main_queue(), ^{ // The main thread stuff goes here 

     if (received ok) { 
      [self receivedData:some data]; 
     } else { 
      [self timedOut]; 
     } 

    }); 
}); 
+1

Bir şey olsa da, Yayın paketini göndermeden önce dinlediğinizden (yani tekrardan) emin olmak isteyebilirsiniz, aksi halde bir gönderme, gönderme ve dinleme arasındaki küçük zaman aralığında geri gelebilir. Bununla birlikte, bunu yapmak için önce geçici bağlantı noktanızı bağlamanız gerekir. – Chris

+0

2s zaman aşımı parçası ile aldığınız hakkında merak ediyorum. Bunu nasıl uygularsınız? – chancyWu