Ios 无法使用CocoaAsyncSocket连接到IPv6
使用连接到iPv6主机时出现问题 我成功地让GCDUDPAsyncSocket工作,但意识到TCP更适合我的用例 不幸的是,我永远无法成功地连接到发布和发现的NSNetService。服务被发现,地址也被发现。尝试连接时未发生故障,但连接永远不会安全 我可以使用“connectWithHost”连接,并传入分配给我的mac的IP地址,但这是我获得IP的唯一方法,就是对其进行硬编码。有没有办法通过NSNetService获取此IP 我正在使用swift、Xcode 7.1.1和iOS 9.1。我正在连接iPhone和运行苹果电视模拟器的Mac电脑。这在UDP中工作良好 无论如何-即使提供了适当的地址,连接尝试也会超时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。我正
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];
}
}
.......
}