GCDAsyncUDPSocket:虽然已成功发送,但未接收任何数据

时间:2016-06-01 04:45:45

标签: ios sockets udp gcdasyncsocket gcdasyncudpsocket

我正在尝试创建UDP套接字并将数据发送到广播端口,以便我可以在同一WiFi网络中的其他设备上接收相同内容。我正在计算接受的答案here中给出的广播端口的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 个答案:

答案 0 :(得分:1)

尝试如下:

创建套接字:

-(void)createClientUdpSocket
{
    dispatch_queue_t dQueue = dispatch_queue_create("client udp socket", NULL);

    sendUdpSocket = [[GCDAsyncUdpSocket alloc] initWithDelegate:self delegateQueue: dQueue socketQueue: nil];
    [sendUdpSocket receiveOnce:nil];
    [sendUdpSocket joinMulticastGroup:[self getIPAddress] error:nil]; // Put your IP Address
    NSLog(@"Ready");
}

Socket的委托方法。

-(void)udpSocket:(GCDAsyncUdpSocket *)sock didReceiveData:(NSData *)data fromAddress:(NSData *)address withFilterContext:(id)filterContext
{
     NSString *ip = [GCDAsyncUdpSocket hostFromAddress:address];
     uint16_t port = [GCDAsyncUdpSocket portFromAddress:address];
     NSString *s = [[NSString alloc] initWithData:data encoding:NSUTF8StringEncoding];
     // Continue to wait for a message to receive the next
     NSLog (@ "The server receives the response [%@:% d]%@", ip, port, s);
     [sock receiveOnce:nil];

     dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (int64_t)(2.0 * NSEC_PER_SEC)), dispatch_get_main_queue(), ^{
     [self sendBackToHost:ip port:port withMessage:s];
   });
}

-(void)sendBackToHost:(NSString *)ip port:(uint16_t)port withMessage:(NSString *)s{

      [sendUdpSocket sendData:yourData toHost:yourIP port:5556 withTimeout:60 tag:200];
       NSLog(@"sent message to server");
}

希望这会有所帮助。它为我工作:)

答案 1 :(得分:0)

我正在回答这个问题,因为我遇到的情景真的与众不同。接收工作有时,有时它不会。 当我安装两个应用程序时,没有收到任何数据。只发送成功。我保留了应用程序,一段时间后应用程序开始接收数据。在某些情况下,它会在一段时间后停止接收。

实际上我使用的是连接到以太网的mac的共享互联网连接。我将我的WiFi网络改为适当的宽带网络,从那时起它就没有任何问题。

希望这有助于有类似情况的人:)