我成功地使用了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")
}
}
}
答案 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地址还是域。