Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

iPhone UDP broadcast and response

I need to send out a UDP broadcast from an iPhone, and then listen for a UDP response with a timeout period. I have found Apple's UDPEcho example but I am not sure if it's what I need. Also found this example to send but not receive. Basically, I need to do something simple like this:

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

I'm hoping for a simple solution where I don't have to reinvent the wheel. I appreciate any advice on the best strategy to implement this!

like image 301
Alex Avatar asked Oct 03 '11 03:10

Alex


2 Answers

You can use cocoaAsyncSocket which is easier to use than apple native classes.
It support UDP with AsyncUdpSocket class.

AsyncUdpSocket is a UDP/IP socket networking library that wraps CFSocket. It works almost exactly like the TCP version, but is designed specifically for UDP. This includes queued non-blocking send/receive operations, full delegate support, run-loop based, self-contained class, and support for IPv4 and IPv6

like image 146
Benoît Avatar answered Sep 30 '22 00:09

Benoît


I'd put 'recvfrom' on another thread using grand central dispatch, like this:

// 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];
        }

    });
});
like image 38
Chris Avatar answered Sep 29 '22 22:09

Chris