IPv6-only的问题

关于IPv6-only的支持问题,在英文的论坛,blog已经有说明。这里再说一下。主要的工作内容就是替换CURL和websockets库。

具体的方式是,下载下面链接的库,然后替换CURL和websockets库

对于v2.x的用户,同时还需要修改 WebSocket.hWebSocket.cpp 这两个文件以适应新的libwebsocket库,具体参见这个commit

常见的问题汇总:

  • 我是否需要升级?
    是的,所有版本都需要升级,除了v3.11.1
  • 我没用websokcet需要升级websocket吗?
    如果没用就不需要升了,用到什么升级什么。
8赞

替换了luasocket连不上了,什么原因啊

luasocket应该和CURL、websocket没有关系吧 @dualface

3.9版本更新websockets库编译错误。
看样子新版本头文件去掉了一些枚举和结构体。
把错误贴在下面,请问出了替换库文件还需要对network中的哪些文件进行修改。

/Users/wangshibo/develop/WG/WarClient/frameworks/cocos2d-x/cocos/network/WebSocket.cpp:104:38: ISO C++ forbids forward references to ‘enum’ types

/Users/wangshibo/develop/WG/WarClient/frameworks/cocos2d-x/cocos/network/WebSocket.cpp:104:68: Variable has incomplete type ‘enum libwebsocket_callback_reasons’

/Users/wangshibo/develop/WG/WarClient/frameworks/cocos2d-x/cocos/network/WebSocket.cpp:108:45: Use of undeclared identifier ‘libwebsocket_context_user’

/Users/wangshibo/develop/WG/WarClient/frameworks/cocos2d-x/cocos/network/WebSocket.cpp:251:33: Subscript of pointer to incomplete type ‘struct libwebsocket_protocols’

/Users/wangshibo/develop/WG/WarClient/frameworks/cocos2d-x/cocos/network/WebSocket.cpp:253:42: Subscript of pointer to incomplete type ‘struct libwebsocket_protocols’

/Users/wangshibo/develop/WG/WarClient/frameworks/cocos2d-x/cocos/network/WebSocket.cpp:253:42: Subscript of pointer to incomplete type ‘struct libwebsocket_protocols’

/Users/wangshibo/develop/WG/WarClient/frameworks/cocos2d-x/cocos/network/WebSocket.cpp:253:42: Subscript of pointer to incomplete type ‘struct libwebsocket_protocols’

/Users/wangshibo/develop/WG/WarClient/frameworks/cocos2d-x/cocos/network/WebSocket.cpp:255:2: Deleting pointer to incomplete type ‘struct libwebsocket_protocols’ may cause undefined behavior

/Users/wangshibo/develop/WG/WarClient/frameworks/cocos2d-x/cocos/network/WebSocket.cpp:312:21: Allocation of incomplete type ‘libwebsocket_protocols’

/Users/wangshibo/develop/WG/WarClient/frameworks/cocos2d-x/cocos/network/WebSocket.cpp:313:26: Invalid application of ‘sizeof’ to an incomplete type ‘libwebsocket_protocols’

/Users/wangshibo/develop/WG/WarClient/frameworks/cocos2d-x/cocos/network/WebSocket.cpp:322:25: Subscript of pointer to incomplete type ‘struct libwebsocket_protocols’

/Users/wangshibo/develop/WG/WarClient/frameworks/cocos2d-x/cocos/network/WebSocket.cpp:323:25: Subscript of pointer to incomplete type ‘struct libwebsocket_protocols’

/Users/wangshibo/develop/WG/WarClient/frameworks/cocos2d-x/cocos/network/WebSocket.cpp:330:21: Subscript of pointer to incomplete type ‘struct libwebsocket_protocols’

/Users/wangshibo/develop/WG/WarClient/frameworks/cocos2d-x/cocos/network/WebSocket.cpp:331:21: Subscript of pointer to incomplete type ‘struct libwebsocket_protocols’

/Users/wangshibo/develop/WG/WarClient/frameworks/cocos2d-x/cocos/network/WebSocket.cpp:403:9: Use of undeclared identifier ‘libwebsocket_context_destroy’; did you mean ‘lws_context_destroy’?

/Users/wangshibo/develop/WG/WarClient/frameworks/cocos2d-x/cocos/network/WebSocket.cpp:403:38: Cannot initialize a parameter of type ‘struct lws_context *’ with an lvalue of type ‘struct libwebsocket_context *’

/Users/wangshibo/develop/WG/WarClient/frameworks/cocos2d-x/cocos/network/WebSocket.cpp:410:9: Use of undeclared identifier ‘libwebsocket_service’

/Users/wangshibo/develop/WG/WarClient/frameworks/cocos2d-x/cocos/network/WebSocket.cpp:434:17: Assigning to ‘const struct lws_protocols *’ from incompatible type ‘struct libwebsocket_protocols *’

/Users/wangshibo/develop/WG/WarClient/frameworks/cocos2d-x/cocos/network/WebSocket.cpp:436:20: Use of undeclared identifier ‘libwebsocket_get_internal_extensions’

/Users/wangshibo/develop/WG/WarClient/frameworks/cocos2d-x/cocos/network/WebSocket.cpp:442:15: Use of undeclared identifier ‘libwebsocket_create_context’; did you mean ‘lws_create_context’?

Too many errors emitted, stopping now

—更新—
看样子是命名改变了
一些libwebsocket_* 都变成了lws_* 。
哎。

—更新2—
另外还有一些函数传递的参数变了,改一下就好了。
以前的ctx现在由lws_context* ctx = lws_get_context(wsi);取得,貌似不用传递了。
现在编译可以通过了,要是有什么问题再来更新。

—更新3—
WebSocket::onSocketCallback中的几个assert卡住了,去掉应该就可以了。

1赞

@1111922 是的,websocket库升级不兼容了。

1赞

经过测试,在iphone4s(8.3)和iphone5(9.1)上不能连接,iphone6p(9.3)可以连接。
不知道问题出在哪了。

1赞

IPv6-only的问题 继续讨论:

我做单机游戏的,用cocos sudio3.10, 消星星连连看那种, 但是用到admob广告和微信分享, 是否需要升级?

我已经更新了
v2.x开发者: v2-deps-7 里面的curl 库,和web sockets 库,编译链接都没有问题,就是http请求会出错

httpclient.cpp 里面的
bool perform(int *responseCode)
{
if (CURLE_OK != curl_easy_perform(m_curl))
return false;
这行逻辑在ipv6 网络下一直返回连接创建不成功

会不会是因为使用了IP地址而不是域名???

我用的是quick 3.3 , 我替换完之后编译也都没问题, 但是 ipv6环境中, 访问域名http的时候 在 CCHTTPRequest.cpp 中 红色方框中的code值一直返回是CURLE_COULDNT_CONNECT(不能连接到remote 主机或者代理)
请问这是什么原因呢?
希望能帮忙解答 非常感谢。

v2.x编译显示:7>c:\users\jin\desktop\cocos2d-x-2.2.6\external\libwebsockets\win32\include\libwebsockets.h(113): fatal error C1083: 无法打开包括文件:“lws_config.h”: No such file or directory

我也遇到同样的问题了,你解决了吗?
我用3.11.1的工程测试目标地址可以请求到。

您好 我的luasocket的也连不上 请问 您解决了吗

@minggo 您好 luasocket连不上 您知道是什么原因吗

我2.2.3的项目按照这个方法配置后,编译和链接都可以了,但是运行的时候用CCHttpClient请求总是失败,

/// @param responseCode Null not allowed
bool perform(int *responseCode)
{
    CCLog("perform responseCode:%d",(*responseCode));
    CURLcode cd1= curl_easy_perform(m_curl);
    CCLog("curlcode:%d",cd1);
    if (CURLE_OK != cd1)
        return false;
    CURLcode code = curl_easy_getinfo(m_curl, CURLINFO_RESPONSE_CODE, responseCode);
    CCLog("respone code:%d",(*responseCode));
    if (code != CURLE_OK || *responseCode != 200)
        return false;
    return true;
}

这个方法中cd1的值总是7(CURLE_COULDNT_CONNECT)

luasocket 可以用了吗

@摇晃的红酒杯 我之前是在iPhone6测试的没有问题,不过应该和iOS系统没有关系吧。
@tom170 admob和微信分享和引擎没有关系,有问题的话得找对应的库解决
@lifeiying 连接的地址是?在非IPV6没问题?
@xingfude_123 对应的头文件也要替换,包含了lws_config.h的
@疯狂暴走哇 luasocket使用的是源码,估计得升级luasocket版本

关于v2.x连接不上的问题我会再测试一下。

我刚刚用v2.x最新的代码(使用deps-7)测试,没有问题啊,HttpClient正常连接啊。对了,这里要强调一点,因为只有app store有这个限制,所以v2.x我们只更新了iOS的库,所以请使用iOS真机测试。

@wang1990yujin 你的问题解决了没。
@minggo 我如悠悠漫步的问题,替换curl库,连接返回 CURLE_COULDNT_CONNECT,用其他网络没问题