2011-10-03 32 views
8

Tôi cần gửi một bản phát sóng UDP từ iPhone và sau đó lắng nghe phản hồi UDP với khoảng thời gian chờ. Tôi đã tìm thấy UDPEcho example của Apple nhưng tôi không chắc chắn đó là những gì tôi cần. Cũng tìm thấy this example để gửi nhưng không nhận được. Về cơ bản, tôi cần phải làm một cái gì đó đơn giản như thế này:Phát và trả lời iPhone UDP

//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 

Tôi hy vọng cho một giải pháp đơn giản mà tôi không cần phải tái tạo lại bánh xe. Tôi đánh giá cao bất kỳ lời khuyên nào về chiến lược tốt nhất để thực hiện điều này!

Trả lời

5

Bạn có thể sử dụng cocoaAsyncSocket dễ sử dụng hơn các lớp gốc táo.
Nó hỗ trợ UDP với lớp AsyncUdpSocket.

AsyncUdpSocket là thư viện mạng ổ cắm UDP/IP kết thúc tốt đẹp CFSocket. Nó hoạt động gần giống như phiên bản TCP, nhưng là được thiết kế riêng cho UDP. Điều này bao gồm xếp hàng non-blocking gửi/nhận các hoạt động, hỗ trợ đại biểu đầy đủ, chạy vòng lặp dựa, khép kín lớp, và hỗ trợ cho IPv4 và IPv6

+0

Cảm ơn, thật dễ dàng. Tôi đã cung cấp hầu hết mã của mình ở đây: http://stackoverflow.com/questions/5790149/little-problem-with-asyncudpsocket-receiving-data-after-connecting-to-broadcast-i/7682688#7682688 – Alex

5

Tôi muốn đưa 'recvfrom' trên thread khác sử dụng công văn lớn của trung tâm, như sau:

// 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

Một điều, bạn có thể muốn chắc chắn rằng bạn đang nghe (tức là recvfrom) trước khi bạn gửi gói phát sóng, nếu không một phản ứng có thể trở lại trong khoảng cách thời gian nhỏ giữa gửi và nghe. Tuy nhiên, để làm điều này, trước tiên bạn phải ràng buộc cổng tạm thời của mình. – Chris

+0

Tôi rất tò mò về việc bạn nhận được phần thời gian chờ là 2 giây. làm thế nào để bạn thực hiện điều này? – chancyWu

Các vấn đề liên quan