无法使用CocoaAsyncSocket连接到IPv6

时间:2015-12-03 00:01:46

标签: ios swift sockets ipv6

使用CocoaAsyncSocket library

连接到iPv6主机时出现问题

我成功地使用了GCDUDPAsyncSocket,但实现了TCP更适合我的用例。

不幸的是 - 我永远无法成功连接已发布和发现的NSNetService。发现服务并发现地址。没有发生故障的连接尝试发生但连接永远不会受到保护。

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

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

}

2 个答案:

答案 0 :(得分:1)

请更新您的CocoaAsyncSocket库。该问题已在5月2日提交时修复。所以这应该适用于以下标志设置为false

socket.IPv4PreferredOverIPv6 = NO;

这将允许您的应用/游戏以IPv4和IPv6连接。截至6月1日,Apple拒绝接受不符合IPv6网络的应用程序。您的应用程序应该在IPv6网络中没有任何问题。

答案 1 :(得分:0)

您可以设置

  

socket.IPv4PreferredOverIPv6 = NO;

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

+ (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中运行良好,无论HOST是IP地址还是域。

相关问题