マルチキャスト メッセージ (SSDP) を送信し、そのプロトコルを実装するデバイスからの応答をリッスンする iOS アプリケーションを構築しています。GCDAsyncUdpSocket を使用して UDP ソケットを作成し、SSDP メッセージをブロードキャストして応答を受信しています。私が抱えている問題は、アプリケーションがネットワーク上のすべてのデバイスから受信するメッセージが同じであるということです。つまり、HTTP 412
応答です。
これが私のコードです:
ソケットの初期化
@interface ViewController ()
{
GCDAsyncUdpSocket *udpSocket;
}
@end
@implementation ViewController
- (void)viewDidLoad
{
[super viewDidLoad];
udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dispatch_get_main_queue()];
NSError *error = nil;
if (![udpSocket bindToPort:0 error:&error])
{
NSLog(@"Error binding: %@", [error description]);
return;
}
if (![udpSocket beginReceiving:&error])
{
NSLog(@"Error receiving: %@", [error description]);
return;
}
[udpSocket enableBroadcast:YES error:&error];
if (error != nil)
{
NSLog(@"Error enableing broadcast: %@", [error description]);
return;
}
NSLog(@"Socket Created");
}
ソケットの作成
- (IBAction)socketFind:(id)sender
{
NSString *str = [[NSString alloc] initWithString:@"M-SEARCH * HTTP/1.1\r\nHOST: 239.255.255.250:1900\r\nMAN: \"ssdp discover\"\r\nMX: 3\r\nST: ssdp:all\r\nUSER-AGENT: iOS UPnP/1.1 TestApp/1.0\r\n\r\n"];
NSData *data = [str dataUsingEncoding:NSUTF8StringEncoding];
[udpSocket sendData:data toHost:@"239.255.255.250" port:1900 withTimeout:-1 tag:0];
NSLog(@"Sent Data");
}
データ受信コールバック
- (void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data
fromAddress:(NSData *)address
withFilterContext:(id)filterContext
{
NSLog(@"Did Receive Data");
NSString *msg = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
if (msg)
{
NSLog(@"Message: %@",msg);
}
else
{
NSString *host = nil;
uint16_t port = 0;
[GCDAsyncUdpSocket getHost:&host port:&port fromAddress:address];
NSLog(@"Unknown Message: %@:%hu", host, port);
}
}
関数が呼び出されると、didReceiveData
次のメッセージが表示されます。
Message: HTTP/1.1 412 Precondition Failed
Connection:close
CONTENT-LENGTH:0