我正在嘗試創建一個UDP套接字並將數據發送到廣播端口,以便我可以在同一WiFi網絡中的其他設備上接收相同的數據。我正在計算接受的答案here中給出的廣播端口的IP地址。GCDAsyncUDPSocket:雖然它成功發送,但沒有收到任何數據
之後,我已經寫了一些連接代碼是如下:
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:被調用。
請指導我在這裏錯過了什麼。
謝謝!
UPDATE: 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::
我面對的場景真的不一樣,很奇怪。接收工作有時候並且有時不會。 當我安裝了兩個應用程序時,沒有收到數據。只有發送成功。我保留了應用程序,並在一段時間後應用程序開始接收數據。在某些情況下,它會在一段時間後停止接收,或者一直沒有收到任何問題。可能是什麼問題?
由於UDP連接少,因此不需要調用'connectToHost'。你應該使用'sendData:toHost:port:withTimeout' – Paulw11