自编译libwebsockets支持ipv6连接时出错:No route to host

curl库用官方编译的直接覆盖没问题, 因为需要websocket支持ssl, 我自己用这个版本编译的: libwebsockets-1.3-chrome37-firefox30.zip
加上了-DLWS_IPV6=1这个参数, 但是模拟ipv6-only网络后,链接websocket服务器的时候出现了错误编号65, 查了下是no route to host. 但是我用手机上的safari直接访问url是可以的. 另外我传的是域名不是ip.

websocketlog, level:4, lwslog:IPV6 compiled in and enabled
websocketlog, level:4, lwslog:libev support not compiled in
websocketlog, level:16, lwslog:Connect failed errno=65

websocketlog, level:16, lwslog:close: just_kill_connection

websocketlog, level:8, lwslog:remove_wsi_socket_from_fds: wsi=0x1d74d10, sock=23, fds pos=1

websocketlog, level:16, lwslog:not calling back closed

websocketlog, level:16, lwslog:closing: shutdown ret 57

查了下代码应该是在这里出的问题:

#ifdef LWS_USE_IPV6
  if (LWS_IPV6_ENABLED(context)) {
    v = (struct sockaddr *)&server_addr6;
    n = sizeof(struct sockaddr_in6);
  } else
#endif
  {
    v = (struct sockaddr *)&server_addr4;
    n = sizeof(struct sockaddr);
  }

  if (connect(wsi->sock, v, n) == -1 || LWS_ERRNO == LWS_EISCONN) {

从前面的日志可以看出来LWS_USE_IPV6这个应该是true的,不知道为什么会no route to host…

你用ip访问的网络还是域名?

域名, 我在帖子里说了… 不过还是多谢帮忙

@mobic cocos2d-x是用这个仓库来编译第三方库的。编译的方法就是

cd build
./build.sh -p=android --libs=websockets

你可以修改contrib/src/websockets/rules.mak添加你需要的编译参数

我拿最新的代码编译了下, 在ipv4网络下链接失败, 错误码36(ENAMETOOLONG), 我打印出来ip地址一看,前面有ipv6的头,不知道什么情况…
如下:
::ffff:106.75.21.160

说明下,我用的代码就是这里的: https://github.com/cocos2d/cocos2d-x-3rd-party-libs-src

看了下websocket.cpp的代码 ,貌似在lws_create_context这个方法调用的时候可以传递参数info.options = 0;来确定是否启用ipv6, 但是这里是0, 就是说默认开启ipv6, 最后用的就是sockaddr_in6而不是sockaddr_in, 所以我在ipv4网络环境下是不是就会出问题? 但是我用的git代码库最新的websocket.cpp呀,为什么别人都没事呢?commit是: 264bf87c87ded7e1ed0c3f86ca0b51622d2af11e

我又测试了下, 貌似和这个没关系, options设置成32禁用ipv6, 一样连不上, 真奇怪,ios模拟器真机测试都不行,我就使用代码库最新版本编译的呀…
rules.mak相关参数如下:

  cd $< && $(HOSTVARS) CFLAGS="$(CFLAGS) $(EX_ECFLAGS)" $(CMAKE) -DLWS_WITHOUT_SERVER=1 -DLWS_WITHOUT_TEST_SERVER=1 -DLWS_WITHOUT_TEST_SERVER_EXTPOLL=1 -DLWS_WITHOUT_TEST_PING=1 -DLWS_IPV6=1 $(make_option)

我已经解决了, 是个比较小的地方的问题。 好像只有我一个人遇到了… 真是无语, 以后有其他人遇到再交流吧。

@mobic 欢迎分享。如果是引擎的问题,能提个PR最好了。

请问是怎么解决的呢?我也遇到了同样的问题 ipv6的地址 getsockopt(udbSock, SOL_SOCKET, SO_ERROR, &error, &len)的时候总是报 No route to host。

提交了:
https://github.com/cocos2d/cocos2d-x/pull/15888