我正在用C ++进行套接字编程,我看到很多函数都采用结构指针和大小。例如,
struct sockaddr dest;
//fill dest
sendto(dgram_socket, secret_message, len, 0, &dest, sizeof dest);
当函数可以从类型中清楚地解释它时,通过固定长度结构(sockaddr)的大小是什么意思?
答案 0 :(得分:4)
因为实际上sockaddr在这里只是占位符数据类型。 您传递的实际数据结构可能有所不同。例如,IPv4和IPv6的地址结构在内容和长度上不同。这就是传递结构尺寸的关键。
一般来说,这是一种广泛使用的技术。这两个大小都是作为additioanl参数传递的,或者size成员直接包含在结构中(通常,作为它的第一个成员)。这允许接收函数区分该结构的不同已知版本,在这种情况下,当API随时间变化并添加新成员时,但仍然使用较旧的API定义编译的程序通过的结构实际大小小于它。在最近的一个。这是Windows API中面临的典型技术 - 许多Windows本机结构中都包含DWORD cbSize
。
答案 1 :(得分:2)
sockaddr
结构的大小实际上没有固定 - 不同类型的套接字需要不同大小的地址信息(例如IPv4或IPv6)。
因此,在这种特殊情况下,指定实际sockaddr
的长度实际上是有用且必要的。
请参阅示例http://pubs.opengroup.org/onlinepubs/009695399/basedefs/sys/socket.h.html。