2

私は現在 XCode 5.0 を使用しており、CocoaAyncSocketライブラリを使用する iOS 7 サンプル アプリケーションに取り組んでいます。このアプリケーションでは、「送信側コントローラー」が UDP メッセージを送信255.255.255.255port 4000、「受信側コントローラー」が処理して出力します。「送信側コントローラー」には、メッセージを 200 回ブロードキャストする for ループがあります。Wireshark を使用して (フィルタリングでudp.port == 4000)、200 個のパケットのうち 0 個が失われました。これは素晴らしいことです! この環境では、すべてがうまく機能し、「受信側コントローラー」がすべてのメッセージを出力します。

しかし、アプリケーションを実際の iPad (iPad MD328LL/A 16GB、Wi-Fi 第 3 世代 iOS 7) に移動すると、一部のパケットが失われます。200 個のうち、約 60% ~ 65% のパケットが WireShark によって取得され、「受信側コントローラー」に到達します。そのライブラリが (シミュレーターと完全に連携するため、私はそうは思いません) パケット損失の問題を引き起こしているのか、それとも iOS 7/iPad なのかはよくわかりません。

コード:

// Sender Controller

@interface ViewController ()
{
    GCDAsyncUdpSocket *udpSocket;
}
@end


- (void)viewDidLoad
{
    [super viewDidLoad];

    if (udpSocket == nil)
    {
        [self setupSocket];
    }
    // ...
}

// set ups socket
- (void)setupSocket
{   
    // Initialize
    udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];

    // Enable Broadcast
    [udpSocket enableBroadcast:YES error:nil];

    NSError *error = nil;

    // Bind to port
    if (![udpSocket bindToPort:0 error:&error])
    {
        [self logError:FORMAT(@"Error binding: %@", error)];
        return;
    }
    if (![udpSocket beginReceiving:&error])
    {
        [self logError:FORMAT(@"Error receiving: %@", error)];
        return;
    }

    [self logInfo:@"Ready"];
}

// ...


// Click event
- (IBAction)send:(id)sender
{
    // Format message
    NSData *data = [msg dataUsingEncoding:NSUTF8StringEncoding];

    // Broadcast message 200 times
    for (int i = 0 ; i < 200; i++) {
        [udpSocket sendData:data toHost:host port:port withTimeout:-1 tag:0];
    }
}

このシナリオでは、これらのメッセージが高速で送信されており、ユーザーがこのような 200 回のブロードキャストを送信する可能性はほとんどありません。また、UDP は安価であり、パケットの形式が正しくなかったり、パケットが失われたりする可能性があることも理解していますが、40% の割合で... 私にはかなり高いようです。

誰かがこれまたは有用な情報に関する提案/経験を持っている場合、それは大歓迎です

前もって感謝します!

4

0 に答える 0