CocoaAsyncSocket(GCDAsyncSocket)

作者: 子达如何 | 来源:发表于2016-06-14 21:55 被阅读1137次

设置IPv4PreferredOverIPv6 属性为NO即可。
就这么简单:)
得到@郭秀才的提示.
如果你还是想用IP地址作为Host发起连接的话, 还需要做一个地方的修改

+ (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.

                    // 此处修改的合理性, 有待考察, Apple建议对IPv6-Only的支持方式是取消使用IP地址, 全部改用域名的方式
                    // 域名方式下, sin_port是有正确的值的. 
                    // 另外, IPv6 是否允许路由器变更端口, 这个也有待考察, 如果允许路由器变更端口, 那么这段代码的处理就有BUG了
                    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];
                }
            }
    //....
}

相关的修改已经提交到了这里

相关文章

网友评论

  • d2587c509cae:请问作者我想搜索需要连接的host该怎么做呢?
    子达如何:@墓狱 你的思路很野。我的理解,IP和端口是唯一确定一个终端的参数。只有端口,你怎么知道你到底想要连谁呢?如果你希望做类似终端发现之类的东西,就需要用到一些广播协议,收到这些广播协议的终端给你应答,你就可以发现这个终端了。
    d2587c509cae:@子达如何 我有端口号,如何通过搜索然后筛选得到需要的IP地址。这个是的用UDP广播的形式来做吗?我不知道具体该如何来做。
    子达如何:能详细一点说明一下吗?你是有IP地址,希望得到host吗?
  • 励志当学霸的皮皮:感谢楼主分享.我遇到这个问题,在ipv6环境下,iOS10系统没事,9系统socket就不会发消息. 卡了两天了,想交流一下经验 用的也是GCDAsyncSocket
    子达如何:@励志当学霸的忧伤叽 可能需要调试一下,或者观察一下日志有什么异常的地方了。没有具体的实例,比较难帮你。或者你是否可以把你们的使用情况抽象一个简单的demo发给我看看?
    励志当学霸的皮皮:@子达如何 项目中基本上是用socket作为网络连接,在ipv6环境下(服务器地址为ip+端口),iOS 10系统socket都可以正常的发送消息,但是iOS9 就是显示连接失败. 一直不知道问题出在哪里,socket的ipv6适配也按照你文章中改了
    子达如何:@励志当学霸的忧伤叽 暂时不清楚你是什么情况,具体描述一下?
  • 0a71a955d242:请IPv4PreferredOverIPv6属性设置为No是设置在GCDAsyncSoctet第三方框架的类里还是设置在代码中进行连接的地方
    子达如何:@银翼骑士 新的库已经支持了,你可以传IPv4的地址进去,如果接的网管是IPv6的话,会得到IPv6的地址,就版本有bug拿不到IPv6地址,需要更新
    0a71a955d242:@子达如何 我用的GCDAsyncsocket库好像和你不一样,我找到的lookuphost那个方法和你的不大一样,我的库可能是很老的了,主要是我要做你把v4地址转成v6的转换,有什么其他方法可以转不
    子达如何:@银翼骑士 直接给你创建的对象设置这个属性即可。另外,这个库官方应该有针对ipv6做了相关更新,可以看看这个属性现在是不是已经默认打开了
  • 8d345acefd23:帮忙弄好了给钱也可以的!!
    子达如何:@三月DD 不知道你的网络那块代码是怎么样的, 没法帮忙的~
  • 8d345acefd23:做游戏开发的···用cocoa2dx写的代码!要如何才能支持IPv6啊!楼主能帮帮我么?被打回很多次了!网上目前也没看见教程。。
    8d345acefd23:@子达如何 测试过了啊!就是不能运行哦!IPv4网络下可以运行,IPv6网络下就不能运行了!
    子达如何:@三月DD 最简单的办法是不直接用IP地址,然后按照Apple的方案应iMac搭建一个nat64的网络,测试你的app可以链接就行了
  • 郭秀才:No,还要改一点东西
    郭秀才:GCDAsyncSocket.m文件里lookupHost:port:error方法里加上如下“ADD”部分

    ......
    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.

    //Add IPv6-only network support
    if (((struct sockaddr_in *)res->ai_addr)->sin_port == 0)
    ((struct sockaddr_in *)res->ai_addr)->sin_port = htons(port);
    //end Add

    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.

    // Add IPv6-only network support
    if (((struct sockaddr_in6 *)res->ai_addr)->sin6_port == 0)
    ((struct sockaddr_in6 *)res->ai_addr)->sin6_port = htons(port);
    //end Add

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

    这样子调整后,不管是上传还是下载都可以完美适配IPv6-only network,亲测有效。
    子达如何:@郭秀才 目前只改了这一处测试已经OK,求指教还要改哪里?
    Nasser:@郭秀才 还需要改什么呢?

本文标题:CocoaAsyncSocket(GCDAsyncSocket)

本文链接:https://www.haomeiwen.com/subject/yovudttx.html