ネットワーク上に、UDPを介して非常に小さなファイルをマルチキャストしているデバイスがあります。私が開発しているiOSアプリは、これらのパケットの読み取りを担当しており、GCDAsyncUdpSocketを使用して読み取ることを選択しました。ファイルは0.5秒ごとに送信されますが、私はそれほど頻繁には受信していません(約3〜10秒ごとにのみ受信しています)。
デバイスに問題があるのではないかと考え、Wiresharkでトラフィックの監視を開始しました。これは、Wiresharkで「監視モード」を有効にするまでアプリに表示されていたものを反映しているように見えました。有効にすると、すべてのUDPパケットがキャプチャされていました。さらに、iOSシミュレーターは、私が開発しているMacとNICを共有しているため、欠落しているすべてのパケットの受信を開始しました。
iOSデバイスまたは不足しているパケットを受信できるようにする何かが不足している場合に「監視モード」を有効にする方法はありますか?また、GCDAsyncUdpSocketにreadStreamメソッドがあることもわかります。おそらく、beginReceivingの代わりにこれを使用する必要がありますか?その場合、Objective-Cでストリームを設定する方法はわかりませんが。
これが私のテストコードです。
- (void)viewDidLoad
{
[super viewDidLoad];
// Do any additional setup after loading the view, typically from a nib.
NSLog(@"View Loaded");
[self setupSocket];
}
- (void)setupSocket
{
udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
NSError *error = nil;
if (![udpSocket bindToPort:5555 error:&error])
{
NSLog(@"Error binding to port: %@", error);
return;
}
if(![udpSocket joinMulticastGroup:@"226.1.1.1" error:&error]){
NSLog(@"Error connecting to multicast group: %@", error);
return;
}
if (![udpSocket beginReceiving:&error])
{
NSLog(@"Error receiving: %@", error);
return;
}
NSLog(@"Socket Ready");
}
- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data
fromAddress:(NSData *)address
withFilterContext:(id)filterContext
{
NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
if (msg)
{
NSLog(@"RCV: %@", msg);
}
else
{
NSString *host = nil;
uint16_t port = 0;
[GCDAsyncUdpSocket getHost:&host port:&port fromAddress:address];
NSLog(@"Unknown message from : %@:%hu", host, port);
}
}
将来ここを見に来る人のための解決策:
ilmiacsの回答に基づいて、ターゲットのiOSデバイスにpingを実行することで、欠落しているパケットの数を大幅に減らすことができました。Macを使用して、これをターミナルで実行しました-
sudo ping -i 0.2 -s 4 <Target IP>
MacでiOSデバイスにpingを実行して実行しているので、AppleのiOS pingの例を調べて、デバイス自体にpingを実行して独自のワイヤレスアダプター(127.0.0.1)を刺激できるかどうかを確認します。