我知道sockaddr_in用于IPv4,sockaddr_in 6用于IPv6.我感到困惑的是[6]中sockaddr和sockaddr_之间的区别.

有些函数接受sockaddr,有些函数接受sockaddr_insockaddr_in6,因此:

  • 规则是什么?
  • 为什么需要两种不同的 struct ?

而且因为这sizeof(sockaddr_in6) > sizeof(sockaddr) == sizeof(sockaddr_in)美元.

  • 这是否意味着如果我们需要支持IPv4和IPv6,我们应该始终使用sockaddr_in6来分配堆栈中的内存,并强制转换为sockaddr和sockaddr_in?

一个例子是:我们有一个套接字,我们想得到它的字符串ip地址(可以是ipv4或ipv6).

我们先拨打getsockname获得addr,然后根据addr.sa_family拨打inet_ntop.

这段代码有什么问题吗?

char ipStr[256];
sockaddr_in6 addr_inv6;
sockaddr* addr = (sockaddr*)&addr_inv6;
sockaddr_in* addr_in = (sockaddr_in*)&addr_inv6;

socklen_t len = sizeof(addr_inv6);
getsockname(_socket, addr, &len);

if (addr->sa_family == AF_INET6) {
    inet_ntop(addr_inv6.sin6_family, &addr_inv6.sin6_addr, ipStr, sizeof(ipStr)); 
    // <<<<<<<<IS THIS LINE VALID, getsockname expected a sockaddr, but we use 
    // it output parameter as sockaddr_in6.
} else {
    inet_ntop(addr_in->sin_family, &addr_in->sin_addr, ipStr, sizeof(ipStr));
}

推荐答案

我不想回答我的问题.但为了在这里提供更多可能对其他人有用的信息,我决定回答我的问题.

之后深入挖掘linux的源代码.以下是我的发现,可能有多个协议都实现了getsockname.每个都有自己的下划线地址数据 struct ,例如,对于IPv4是sockaddr_in,IPV6是sockaddr_in6,对于AF_UNIX套接字是sockaddr_un.sockaddr被用作这些API签名中的公共数据支柱.

这些API将根据memcpy的另一个参数length将SocketAddress_in或SockeAddr_in 6或SockeAddr_un复制到SockeAddr.

并且所有的数据 struct 都以相同类型的字段sa_family开始.

基于这些原因,代码片段是有效的,因为sockaddr_insockaddr_in6都有sa_family,然后我们可以在判断sa_family之后将其转换为正确的数据 struct 以供使用.

顺便说一句,我不确定为什么根据sockaddr大小分配内存的sizeof(sockaddr_in6) > sizeof(sockaddr)对于IPv6来说是不够的(这很容易出错),但我猜这是因为历史原因.

C++相关问答推荐

如何通过Zephyr(Devicetree)在PR Pico上设置UTE 1?

在使用GTK 4 Columnview列表模型时,如何为多列添加排序函数.C编码,Linux/GNOME环境

如何创建一个C程序来存储5种动物的名字,并在用户 Select 其中任何一种动物时打印内存地址?

X86/x64上的SIGSEGV,由于原始内存访问和C中的DS寄存器之间的冲突,在Linux上用TCC编译为JIT引擎

如何在C中引发/处理自定义信号?

GDB输出ARM助记符

&;(str[i])和(&;str)[i]有什么区别?

为什么双精度d=flt_max+flt_max;在c语言中得到inf的结果

在C语言中,指针指向一个数组

如何使用唯一数字对整型进行分区

递归打印二维数组(C编程)

判断系统命令返回值的正确方法

浮动目标文件,数据段

';malloc():损坏的顶部大小';分配超过20万整数后

未使用sem_open正确初始化信号量

当另一个指向 const 的指针观察到数据时,通过指针更改数据是否安全?

如何为avr atmega32微控制器构建C代码,通过光电二极管捕获光强度并通过串行通信传输数据

C 语言中霍尔分区的快速排序算法

如何修复数组数据与列标题未对齐的问题?

段错误try 访问静态字符串,但仅有时取决于构建环境