2 lihuinan lihuinan 于 2017.08.28 15:38 提问

为什么glibc2.23要修改struct sockaddr_storage?

glibc在2.23版本有一个修改https://patchwork.sourceware.org/patch/12453/.
在我的Cotex A7上试验:
修改前:

 struct sockaddr_in6
{
sin6_family;   //0th byte
sin6_port;     //2nd byte
sin6_flowinfo; //4th byte
sin6_addr;     //8th byte
...
};

struct sockaddr_storage
{
ss_family;    //0th byte
__ss_align;   //4th byte
__ss_padding; //8th byte
};

修改后:

 struct sockaddr_storage
{
ss_family;    //0th byte
__ss_padding; //2nd byte
__ss_align;   //124th byte
};

这次合入把sockaddr__storage结构中的__ss_align和__ss_padding交换了位置。
这样会导致以前常用的下列类型强转的用法出现问题:_

  struct sockaddr_storage prefix_addr
 (struct sockaddr_in6 *)&(prefix_addr)->sin6_addr.s6_addr 

请问有没有人能看出glibc这个修改是什么用意?
我上述的强转用法是否本身就不规范(虽然glibc2.23之前一直运行稳定)。

1个回答

dabocaiqq
dabocaiqq   2018.05.22 23:45
Csdn user default icon
上传中...
上传图片
插入图片
准确详细的回答,更有利于被提问者采纳,从而获得C币。复制、灌水、广告等回答会被删除,是时候展现真正的技术了!
其他相关推荐
从SOCKADDR_STORAGE结构中取IP地址和端口
本人在做IOCP模型的编程时,遇到一个问题就是从SOCKADDR_STORAGE结构中,取出客户的IP地址和端口,以利于统计因为SOCKADDR_STORAGE结构比较复杂,而且兼容了IPV4和IPV6的版本,是直接取不出来的,仔细研究"windows 网络编程"中的代码,意识到,不管怎么样,在收发消息的函数中,肯定是要用到IP和Port信息的,收发消息函数如下:rc=WSARecvFrom(so
WinPcap编程错误:error C2079: 'IPAddress' uses undefined struct 'sockaddr_storage的解决办法
出现这个问题的原因一般是由于Winsock的版本和IPv4和IPv6的版本兼容性问题。由于新版的 Winpcap 完全使用了新的 Winsock(支持IPv6),因此这个问题可能影响到每一个已有程序。 以下是新旧两版的 packet32.h 之间的差异:【新版本】typedef struct npf_if_addr {    struct sockaddr_storage
ushare编译之 ‘struct sockaddr_storage’ has no member named ‘s_addr’
编译ushare的时候出现‘struct sockaddr_storage’ has no member named ‘s_addr’ 这是使用libupnp1.6.19出现版本不兼容的错误。 解决方法:libupnp换成1.4.2版本 配置: -------------------------------------------------------------------
使用vc 编译 wpcap.dll(WpcapSrc_4_0_2.zip版本)时 struct sockaddr_storage编译通不过的解决方法.
  使用vc 编译 wpcap.dll(WpcapSrc_4_0_2.zip版本)时 struct sockaddr_storage编译通不过的解决方法.1.        从http://www.microsoft.com/msdownload/platformsdk/sdkupdate/psdk-full.htm 下载psdk2.        把下载的psdk安装到任意路径下:假
linux下socket通信常用的结构与头文件
参考书籍: 《TCP/IP详解,卷1:协议》 《TCP/IP详解 卷2:实现》 《计算机网络第五版》谢希仁 《unix网络编程》 1. 错误提示:  a) Connection refused :连接被拒绝   2. Socket 通信常用的头文件 a) Sys/socket.h : i. sockaddr 结构: struct sockaddr是通用的套接
sockaddr类型重定义
这时说的sockaddr类型重定义错误, 实际上包括一大堆: sockaddr, ;sockaddr_in等等. 这是由于windows.h和winsock2.h包含的顺序而造成的错误: 正确的顺序是先包含winsock2.h再包含windows.h, 但好多情况下, 程序最前端往往都是#include , 所以在后面的程序中(尤其是引用别人的程序时), 就会出现这些socket相关的类型的
从sockaddr中取得Ip地址和端口号
在socket编程中,服务器端accept()等待一个客户端的连接,当连接成功后,accept拷贝客户端的地址信息到sin_addr里面,我们如何从sin_addr取得此客户端的Ip地址和端口号呢?   实际上,当sockaddr_in.sin_family = AF_INET时,sockaddr = sockaddr_in。   据此,我们可以做一下转换,就可以利用 inet_nto
struct sockaddr定义及延伸
跟踪看一下 strcut sockaddr 是怎么定义的,这个定义在 /usr/include/bits/socket.h 里 引用 struct sockaddr   {     __SOCKADDR_COMMON (sa_);        char sa_data[14];             }; 由上可见,sockaddr 结构体的第一个成员是一个宏定义,再来看一下这个宏
error: 'struct proc_dir_entry' has no member named 'owner'的解决方法
在编译Android 4.0驱动的时候,使用到了proc_dir_entry结构体中的owner成员,但是编译的时候,却出现了下面的错误: [plain] view plaincopy drivers/hello/hello.c:217: error: 'struct proc_dir_entry' has no member named 'owner'
【VS开发】从sockaddr中取得客户端或者数据源的Ip地址和端口号
在socket编程中,服务器端accept()等待一个客户端的连接,当连接成功后,accept拷贝客户端的地址信息到sin_addr里面,我们如何从sin_addr取得此客户端的Ip地址和端口号呢? 实际上,当sockaddr_in.sin_family = AF_INET时,sockaddr = sockaddr_in。 据此,我们可以做一下转换,就可以利用 inet_ntoa()