2015-12-03 86 views
1

有问题连接到IPv6与CocoaAsyncSocket library无法连接到IPv6 CocoaAsyncSocket

我已成功地GCDUDPAsyncSocket工作,但实现TCP是更适合我的使用情况主机。

不幸的是 - 我永远无法成功地连接发布和发现的bonjour NSNetService。该服务被发现并且地址也被发现。连接尝试没有失败发生,但连接永远不会受到保护。

我可以连接使用“connectWithHost”并传递分配给我的Mac的IP地址,但这是唯一的方法,我可以得到该IP是通过硬编码它。有没有办法通过NSNetService获取这个IP?

我使用的是swift,Xcode 7.1.1和iOS 9.1。我正在连接iPhone和运行Apple TV Simulator的Mac。这对UDP很有效。

无论如何 - 即使提供了适当的地址,连接尝试也会超时!

Socket is Disconnecting - Error Domain=NSPOSIXErrorDomain Code=60 "Operation timed out" UserInfo={NSLocalizedDescription=Operation timed out, NSLocalizedFailureReason=Error in connect() function} 

以前有人碰到过这个吗?这里是我的连接代码:

func connectToAddress(sender: NSNetService) { 
if let addresses = sender.addresses { 
    for address in addresses { 
     print(address) 
    } 

    self.serverAddresses = addresses 
    var done = false 

    while !done && (self.serverAddresses.count > 0) { 
     let address = self.serverAddresses[0] 
     self.socket = GCDAsyncSocket(delegate: self, delegateQueue: dispatch_get_main_queue()) 
     do { 
      try self.socket.connectToAddress(address) 
      done = true 
     } catch { 
      print("Unable to Connect") 
     } 
    } 

    if !done { 
     print("Could Not Connect To Address") 
    } 
} 

}

回答

1

请更新您的CocoaAsyncSocket库。这个问题在5月2日提交。因此,这应该与以下标志设置为false

socket.IPv4PreferredOverIPv6 = NO; 

这项工作可以让你的应用程序/游戏在IPv4和IPv6连接。截至6月1日,苹果拒绝了不符合IPv6网络的应用程序。你的应用应该在IPv6网络中没有任何问题的情况下工作。

0

可以设置

socket.IPv4PreferredOverIPv6 = NO;

为@Kumar c项,它会在IPv6的效果很好,但如果你仍然需要用IP地址(使用IP地址作为主机),则可以在GCDAsyncSocket.m如下更新代码(IPv4PreferredOverIPv6应设置为NO在前):

+ (NSMutableArray *)lookupHost:(NSString *)host port:(uint16_t)port error:(NSError **)errPtr 
{ 
    ...... 

    for (res = res0; res; res = res->ai_next) 
     { 
      if (res->ai_family == AF_INET) 
      { 
       // Found IPv4 address. 
       // Wrap the native address structure, and add to results. 

       if (((struct sockaddr_in *)res->ai_addr)->sin_port == 0) 
        ((struct sockaddr_in *)res->ai_addr)->sin_port = htons(port); 

       NSData *address4 = [NSData dataWithBytes:res->ai_addr length:res->ai_addrlen]; 
       [addresses addObject:address4]; 
      } 
      else if (res->ai_family == AF_INET6) 
      { 
       // Found IPv6 address. 
       // Wrap the native address structure, and add to results. 

       if (((struct sockaddr_in6 *)res->ai_addr)->sin6_port == 0) 
        ((struct sockaddr_in6 *)res->ai_addr)->sin6_port = htons(port); 

       NSData *address6 = [NSData dataWithBytes:res->ai_addr length:res->ai_addrlen]; 
       [addresses addObject:address6]; 
      } 
     } 

    ....... 

} 

这将允许你的应用程序以及工作中的IPv4/IPv6无论是主机IP地址或域名。

+0

CocoaAsyncSocket(7.5.0)已经更新,正如我提到的IPv6,所以现在不需要改变任何东西。 – Raniys