从 sockaddr_in* 到 sockaddr* 的类型是否违反了 "strict aliasing rule"?
Is the type cast from sockaddr_in* to sockaddr* a violation of "strict aliasing rule"?
以下类型从 sockaddr_in* 转换为 sockaddr* 是否违反了“严格的别名规则”?
来自“Beej 网络编程指南”(版本 2.3.23)的示例代码片段。类型转换发生在最后一行。
...
#include <arpa/inet.h>
#define MYPORT 3490
main()
{
int sockfd;
struct sockaddr_in my_addr;
sockfd = socket(PF_INET, SOCK_STREAM, 0);
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
my_addr.sin_addr.s_addr = inet_addr("10.12.110.57");
memset(&(my_addr.sin_zero), ’[=12=]’, 8);
bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
在这里,为了方便起见,我包括了这些结构定义:
struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};
// IPv4 AF_INET sockets:
struct sockaddr_in {
short sin_family; // e.g. AF_INET, AF_INET6
unsigned short sin_port; // e.g. htons(3490)
struct in_addr sin_addr; // see struct in_addr, below
char sin_zero[8]; // zero this if you want to
};
struct in_addr {
unsigned long s_addr; // load with inet_pton()
};
许多 UNIX 网络基础都是建立在这些创造性的结构“滥用”之上的。这会使在非 C 代码中使用这些函数和结构变得非常困难,因为许多语言(如 C++)默认禁止这些类型的任意重铸操作。
在 C++ 中,您需要处理这样一个事实,是的,从技术上讲,这些不是有效的强制转换,但 UNIX 网络规范已经存在了几十年,并且是众所周知的商品。无论编译器坚持什么,您都可以对什么是有效转换和什么不是有效转换做出合理的假设。
一如既往,您需要小心行事,尤其是在进行此类转换时。
以下类型从 sockaddr_in* 转换为 sockaddr* 是否违反了“严格的别名规则”?
来自“Beej 网络编程指南”(版本 2.3.23)的示例代码片段。类型转换发生在最后一行。
...
#include <arpa/inet.h>
#define MYPORT 3490
main()
{
int sockfd;
struct sockaddr_in my_addr;
sockfd = socket(PF_INET, SOCK_STREAM, 0);
my_addr.sin_family = AF_INET;
my_addr.sin_port = htons(MYPORT);
my_addr.sin_addr.s_addr = inet_addr("10.12.110.57");
memset(&(my_addr.sin_zero), ’[=12=]’, 8);
bind(sockfd, (struct sockaddr *)&my_addr, sizeof(struct sockaddr));
在这里,为了方便起见,我包括了这些结构定义:
struct sockaddr {
unsigned short sa_family; // address family, AF_xxx
char sa_data[14]; // 14 bytes of protocol address
};
// IPv4 AF_INET sockets:
struct sockaddr_in {
short sin_family; // e.g. AF_INET, AF_INET6
unsigned short sin_port; // e.g. htons(3490)
struct in_addr sin_addr; // see struct in_addr, below
char sin_zero[8]; // zero this if you want to
};
struct in_addr {
unsigned long s_addr; // load with inet_pton()
};
许多 UNIX 网络基础都是建立在这些创造性的结构“滥用”之上的。这会使在非 C 代码中使用这些函数和结构变得非常困难,因为许多语言(如 C++)默认禁止这些类型的任意重铸操作。
在 C++ 中,您需要处理这样一个事实,是的,从技术上讲,这些不是有效的强制转换,但 UNIX 网络规范已经存在了几十年,并且是众所周知的商品。无论编译器坚持什么,您都可以对什么是有效转换和什么不是有效转换做出合理的假设。
一如既往,您需要小心行事,尤其是在进行此类转换时。