ネットワーク上にUDP経由で非常に小さなファイルをマルチキャストするデバイスがあります。私が開発しているiOSアプリはこれらのパケットを読む責任があり、私はGCDAsyncUdpSocketを使用することにしました。ファイルは0.5秒ごとに送信されますが、私はそれほど頻繁に受信しません(約3-10秒ごとに受信します)。iOSのGCDAsyncUdpSocketにマルチキャストされたデータグラムがありません
デバイスに問題があると考えて、私はWiresharkでトラフィックを監視し始めました。これはWiresharkの "Monitor Mode"を有効にするまで、私のアプリで見ていたものを反映しているように見えました。その時点で、すべての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を実行することで、欠落しているパケットの数を大幅に減らすことができます。今、私はそれは、私はAppleのiOSのpingを例に見て、私は、デバイスを持つことができるかどうかを確認するつもりですMacがiOSデバイスにpingを送信して実行していることを
sudo ping -i 0.2 -s 4 <Target IP>
- のMacを使用して、私はターミナルでこれを実行しました独自の無線アダプタ(127.0.0.1)を刺激するためにpingを行います。
あなたは、UDPパケットが**デザインによって提供されていない**ことを認識していますか?アプリケーションでこのケースを処理できる必要があります。 –
はい、私はUDPが信頼できないことを知っていますが、本当に多くのパケットがキャプチャされていない原因になるのでしょうか?また、NICがモニタモードを有効にしている限り、アプリは問題なくすべてのパケットを受信します。 – Squatch
@Squatchどのデバイスを使用したのかわかりますか? –