UDP ソケットを作成し、ブロードキャスト ポートにデータを送信して、同じ WiFi ネットワーク内の他のデバイスで同じデータを受信できるようにしようとしています。ここで受け入れられた回答に示されているように、ブロードキャストポートのIPアドレスを計算しています。
その後、以下の接続コードをいくつか書きました。
self.udpSocket = [[GCDAsyncUdpSocket alloc]initWithDelegate:self delegateQueue:dispatch_get_main_queue() socketQueue:nil];
NSError *error;
[self.udpSocket enableReusePort:YES error:&error];
[self.udpSocket enableBroadcast:YES error:&error];
- (IBAction)sendMessageToBroadcastPort:(id)sender {
[self.udpSocket sendData:[@"Hi" dataUsingEncoding:NSUTF8StringEncoding] toHost:[self getUDPBroadcastAddress] port:5556 withTimeout:-1 tag:1];
}
デリゲート メソッド didSendData: が呼び出されると、データの送信に成功します。
ここで何が欠けているか教えてください。
ありがとう!
更新: ブロードキャスト ポートからデータを受信するための Cpde:
- (void)listenForPackets
{
dispatch_queue_t dQueue = dispatch_queue_create("client udp socket", NULL);
udpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue:dQueue socketQueue:nil];
NSError *error = nil;
if (![udpSocket bindToPort:5556 error:&error]) {
NSLog(@"Error binding: %@",error);//not connecting to host
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);
}
}
計算して得た配信IPは192.168.2.255
更新 2: :
私が直面しているシナリオは、まったく異なり、奇妙です。受信がうまくいくときとうまくいかないときがあります。2 つのアプリをインストールすると、データが受信されませんでした。送信のみ成功しました。アプリをオンのままにして、しばらくするとアプリがデータを受信し始めました。場合によっては、しばらくして受信を停止したり、問題なく受信を続けたりしました。何が問題になる可能性がありますか?