Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/18.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios 无法使用CocoaAsyncSocket连接到IPv6_Ios_Swift_Sockets_Ipv6 - Fatal编程技术网

Ios 无法使用CocoaAsyncSocket连接到IPv6

Ios 无法使用CocoaAsyncSocket连接到IPv6,ios,swift,sockets,ipv6,Ios,Swift,Sockets,Ipv6,使用连接到iPv6主机时出现问题 我成功地让GCDUDPAsyncSocket工作,但意识到TCP更适合我的用例 不幸的是,我永远无法成功地连接到发布和发现的NSNetService。服务被发现,地址也被发现。尝试连接时未发生故障,但连接永远不会安全 我可以使用“connectWithHost”连接,并传入分配给我的mac的IP地址,但这是我获得IP的唯一方法,就是对其进行硬编码。有没有办法通过NSNetService获取此IP 我正在使用swift、Xcode 7.1.1和iOS 9.1。我正

使用连接到iPv6主机时出现问题

我成功地让GCDUDPAsyncSocket工作,但意识到TCP更适合我的用例

不幸的是,我永远无法成功地连接到发布和发现的NSNetService。服务被发现,地址也被发现。尝试连接时未发生故障,但连接永远不会安全

我可以使用“connectWithHost”连接,并传入分配给我的mac的IP地址,但这是我获得IP的唯一方法,就是对其进行硬编码。有没有办法通过NSNetService获取此IP

我正在使用swift、Xcode 7.1.1和iOS 9.1。我正在连接iPhone和运行苹果电视模拟器的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")
    }
}

}请更新CocoaAsyncSocket库。该问题已在5月2日修复。因此,在以下标志设置为false的情况下,应该可以执行此操作

socket.IPv4PreferredOverIPv6 = NO;
这将允许您的应用程序/游戏以IPv4和IPv6连接。截至6月1日,苹果将拒绝使用不符合IPv6网络的应用程序。您的应用程序在IPv6网络中应该可以正常工作。

您可以设置

socket.ipv4 preferredoveripv6=否

正如@Kumar C所提到的,它在IPv6中工作得很好,但是如果您仍然需要使用IP地址(使用IP地址作为主机),您可以在GCDAsyncSocket.m中更新代码,如下所示(IPv4PreferredOverIPv6应首先设置为NO):

这将允许您的应用程序在IPv4/IPv6中运行良好,无论主机是IP地址还是域。

CoCoCoaAsyncSocket(7.5.0)已经更新,正如我提到的IPv6,因此现在不需要更改任何内容。
+ (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];
            }
        }

   .......

}