IPv6网络中,Demo的编译配置选择release,运行时必现崩溃
Closed this issue · 6 comments
原因是IPv6下 sockaddr_in6 长度28,而代码中声明sockaddr 长度16,导致recvfrom函数执行时向sockaddr填充超过其长度的数据,栈异常。
请问这个bug要修改哪里的代码,谢谢了
问题原因:
原因是IPv6下 sockaddr_in6 长度28,而代码中声明sockaddr 长度16,导致recvfrom函数执行时向sockaddr填充超过其长度的数据,栈异常。
解决办法:
参照https://github.com/WeMobileDev/article/blob/master/IPv6%20socket%E7%BC%96%E7%A8%8B.md#%E6%9B%B4%E5%8A%A0%E8%8A%82%E7%9C%81%E7%A9%BA%E9%97%B4%E7%9A%84%E6%96%B9%E6%A1%88 https://github.com/WeMobileDev/article/blob/master/IPv6%20socket%E7%BC%96%E7%A8%8B.md#%E6%9B%B4%E5%8A%A0%E8%8A%82%E7%9C%81%E7%A9%BA%E9%97%B4%E7%9A%84%E6%96%B9%E6%A1%88
的方案:
union sockaddr_union {
struct sockaddr sa; //16
struct sockaddr_in in4; //16
struct sockaddr_in6 in6; //28
} fromAddr;
在 2016年10月13日,下午2:47,LL1992 <notifications@github.com mailto:notifications@github.com> 写道:
请问这个bug要修改哪里的代码,谢谢了
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub #8 (comment), or mute the thread https://github.com/notifications/unsubscribe-auth/AE4YMqiYzKcLaNIxhNy928uQBxK0zJLyks5qzdQSgaJpZM4KHLhs.
你好,
我在LDNetTraceRoute.m中 添加了
union sockaddr_union {
struct sockaddr sa; //16
struct sockaddr_in in4; //16
struct sockaddr_in6 in6; //28
} fromAddr;
注释了原代码中的 // struct sockaddr fromAddr;
然后修改了这两个判断条件:
//将“二进制整数” -> “点分十进制,获取hostAddress和hostName
if (fromAddr.sa.sa_family == AF_INET) {
// code
else if (fromAddr.sa.sa_family == AF_INET6) {
// code
}
这样下来,ipv6网络下不会崩溃了。
换到ipv4也能正常运行。
不知道这样改的对不对。
导致崩溃的地方其实是 recvfrom(recv_sock, buf, 100, 0, &fromAddr.sa, &n)
这里改对就可以了的。
好的,谢谢你了