2011-10-03 21 views
8

iPhoneからUDPブロードキャストを送信してから、タイムアウト時間のあるUDP応答をリスンする必要があります。私はAppleのUDPEcho exampleが見つかりましたが、私はそれが必要なのかどうかはわかりません。また、送信するにはthis exampleが見つかりましたが、受信しませんでした。基本的に、私はこのような単純な何かをする必要があります。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 

私は車輪の再発明する必要はありません簡単な解決策のために願っています。私はこれを実装するための最善の戦略に関するアドバイスを感謝します!

答えて

5

cocoaAsyncSocketは、Appleのネイティブクラスよりも使いやすいものです。
AsyncUdpSocketクラスでUDPをサポートしています。

AsyncUdpSocketは、 CFSocketをラップするUDP/IPソケットネットワーキングライブラリです。これはTCPバージョンとほぼ同じように動作しますが、UDP専用に設計された です。これは、キューに入れられ センド/操作、完全なデリゲートのサポート、ベースの実行ループ、 自己完結型のクラス、およびIPv4とIPv6

+0

ありがとう、それは簡単でした。私はここに私のコードの大部分を提供:http://stackoverflow.com/questions/5790149/little-problem-with-asyncudpsocket-receiving-data-after-connecting-to-broadcast-i/7682688#7682688 – Alex

5

のサポートを受け、私が使用して別のスレッドで「のrecvfrom」を置くところ、非ブロッキング含みグランドセントラルディスパッチは、このように:

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

しかし、ブロードキャストパケットを送信する前にあなたがリッスンしていることを確認したい場合があります。そうしないと、送信と受信の間の小さな時間間隔で応答が返ってくる可能性があります。ただし、これを行うには、まず一時ポートをバインドする必要があります。 – Chris

+0

私はあなたの2sのタイムアウト部分であなたの受信について不思議です。あなたはこれをどのように実装していますか? – chancyWu

関連する問題