对于套接字编程,有两种处理地址的基本结构:struct sockaddr_in和sockaddr。根据man的说法,“这个结构 [ sockadrr ] 的唯一目的是转换在 addr 中传递的结构指针,以避免编译器警告”每个手册、书籍或程序员上的代码片段都会假设一个函数需要一个 struct sockaddr * 您可以轻松安全地将 struct sockaddr_in* 转换为该类型。
来自 man 绑定的示例
struct sockaddr_in myaddr;
int s;
myaddr.sin_family = AF_INET;
myaddr.sin_port = htons(3490);
inet_aton("63.161.169.137", &myaddr.sin_addr.s_addr);
s = socket(PF_INET, SOCK_STREAM, 0);
bind(s, (struct sockaddr*)&myaddr, sizeof(myaddr));
问题是这种转换违反了 MISRA C++ 2008 规则 5-2-7 违规:具有指针类型的对象不应直接或间接转换为不相关的指针类型。
我想知道的是,为了克服这个问题(我相信有很多人在使用套接字和 MISRA)总是有必要证明规则的偏差是合理的?实际上没有其他选择吗?
相关问题解释了对 sockaddr 的转换是如何完成的: