HarmonyOS鸿蒙Next中socket.TCPSocket在连接车机ipv6地址时,有时可能连接车机wifi后没有返回ipv6地址,就没法本地绑定
HarmonyOS鸿蒙Next中socket.TCPSocket在连接车机ipv6地址时,有时可能连接车机wifi后没有返回ipv6地址,就没法本地绑定,这时只能跳过bind直接connect,但是就报错了 {“code”:2301101,“message”:“Network unreachable”}
现在的逻辑是先尝试获取本地的ipv6地址,如果有就bind,然后connect车机的ipv6,工作正常。
有人遇到过没,这种情况有办法解决没啊
开发者您好,为了进一步分析问题,请提供下hilog日志信息和tcpdump日志信息,可以参考以下方式获取:
log版本系统带有betaClub,可以使用如下方式抓取tcpdump+hilog
先清理日志
1.hdc shell
2.cd data/log/hilog
3.hilog -w clear (清除多余日志)
4.exit 退回到目录
一、登录betaClub
二、手机里面的实用工具里面有个betaclub工具,在BetaClub应用里打开TCP dump日志开关,打开日志开关路径:BetaClub->我的->系统设置->TCP dump日志开关。
三、复现问题
四、使用命令hdc file recv /data/log/tcpdump 本地路径,可以抓出tcpdump。
五、使用命令hdc file recv /data/log/hilog 导出hilog
六、提供问题复现时间点
开发者也可以参考这个文档获取tcpdump日志:HarmonyOS Next如何使用WireShark工具抓包。
更多关于HarmonyOS鸿蒙Next中socket.TCPSocket在连接车机ipv6地址时,有时可能连接车机wifi后没有返回ipv6地址,就没法本地绑定的实战系列教程也可以访问 https://www.itying.com/category-93-b0.html
只有测试能复现,测试又在外地,有点麻烦了看来,不过这问题好像不用抓包吧,是没获取到ipv6地址啊,根本还没来到抓包socket这一步啊
开发者您好,需要确认已分配有效的IPv6地址,否则连接会失败。开发者可以使用on(‘netConnectionPropertiesChange’)事件,判断IPv6是否激活,然后再进行连接。核心代码如下:
conn.on('netConnectionPropertiesChange', ((date: connection.NetConnectionPropertyInfo) => {
for (let i = 0; i < date.connectionProperties.linkAddresses.length; i++) {
console.info(LOG_TAG, JSON.stringify(date.connectionProperties.linkAddresses));
// 判断是否是IPV6
if (date.connectionProperties.linkAddresses[i].address.family === 2) {
// 开始连接
this.connect();
break;
} else {
this.flag = false;
}
}
}));
在wifi里看了,只有ipv4的地址,没有ipv6的
👍,
在HarmonyOS鸿蒙Next中,当socket.TCPSocket连接车机IPv6地址时,如果连接Wi-Fi后未获取到IPv6地址,直接调用connect会因缺少本地绑定而报错2301101。这是因为系统网络栈在未分配有效IPv6地址时无法建立连接。
在HarmonyOS Next中,当设备连接车机Wi-Fi后未正确获取IPv6地址时,直接调用TCPSocket.connect()确实可能因缺少本地地址绑定而触发2301101网络不可达错误。这是因为系统在未明确绑定本地地址时,可能无法正确路由IPv6连接请求。
建议解决方案:
-
检查网络状态与地址获取
在连接前,通过@ohos.net.connection模块的getDefaultNet()和getAddresses()方法,主动检测当前网络(特别是车机Wi-Fi接口)的IPv6地址分配状态。若未获取到IPv6地址,可尝试以下备选方案。 -
使用通配地址绑定
即使未获取到具体IPv6地址,可尝试将本地绑定地址设置为IPv6通配地址"::"(或同时指定端口)。示例:let tcp = socket.constructTCPSocketInstance(); tcp.bind({ address: '::', port: 0 }, (err) => { if (!err) { tcp.connect({ address: '车机IPv6地址', port: 端口号 }); } });通配地址允许系统自动选择合适的源地址,可能规避因无绑定地址导致的连接失败。
-
启用IPv4回退机制
若车机Wi-Fi同时支持IPv4,可优先尝试获取IPv4地址进行绑定和连接。若IPv6地址不可用,自动切换至IPv4连接可提升兼容性。 -
延迟连接尝试
部分车机Wi-Fi的IPv6地址分配可能存在延迟。可在连接Wi-Fi后增加短暂等待(如1-2秒),再次检查地址获取状态,然后尝试绑定和连接。 -
错误处理与重试
在connect失败时捕获2301101错误,并触发重试逻辑。重试前可重新检查网络状态,或尝试先断开再连接Wi-Fi以刷新地址分配。
若上述方法仍无法解决,需进一步检查车机Wi-Fi的IPv6路由配置及系统网络策略。注意在开发过程中确保声明ohos.permission.INTERNET网络权限。

