- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
特别是 sin_addr 似乎位于 IPv4 和 IPv6 套接字寻址的不同内存位置。这导致奇怪:
#include <stdio.h>
#include <netinet/in.h>
int main(int argc, char ** argv) {
struct sockaddr_in sa;
printf("sin_addr in sockaddr_in = %p\n", &sa.sin_addr);
printf("sin_addr in sockaddr_in6 = %p\n", &((struct sockaddr_in6*)&sa)->sin6_addr);
};
输出:
sin_addr in sockaddr_in = 0x7fffa26102b4
sin_addr in sockaddr_in6 = 0x7fffa26102b8
为什么这 2 个值不相同?
因为它指向相同的数据(要连接的地址),所以它应该位于相同的地址。否则,您应该如何使用您不知道是 IPv4 还是 IPv6 的 sockaddr_in 来调用 inet_ntop?
最佳答案
Why aren't these 2 values the same ?
sockaddr_in
和 sockaddr_in6
是用于不同地址系列(分别为 IPv4 和 IPv6)的不同结构。它们不需要以任何方式相互兼容,除了一个 - 第一个字段必须是一个 16 位整数来保存地址族。 sockaddr_in
始终将该字段设置为 AF_INET
,而 sockaddr_in6
始终将该字段设置为 AF_INET6
。通过以这种方式标准化 family 字段,任何基于 sockaddr
的 API 都可以访问该字段并知道如何根据需要解释其余的结构数据。这也是为什么基于 sockaddr
的 API 通常也有一个 int
大小值作为输入/输出,因为 sockaddr_in
和 sockaddr_in6
是不同的字节大小,因此 API 需要能够验证您传递的任何缓冲区的大小。
Since this is pointing to the same data (the address to connect to), this should be located at the same address.
不,不应该。地址字段在结构中的位置特定于结构所属的地址族类型。不要求 sockaddr_in
和 sockaddr_in6
将它们的地址存储在完全相同的偏移量处。
Otherwise, how are you supposed to call inet_ntop with a sockaddr_in that you don't know is IPv4 or IPv6 ?
sockaddr_in
只能用于 IPv4,不能用于其他,sockaddr_in6
只能用于 IPv6,不能用于其他。如果你有一个 sockaddr_in
那么你隐含地知道你有一个 IPv4 地址,如果你有一个 sockaddr_in6
那么你隐含地知道你有一个 IPv6 地址。您必须将该信息指定给 inet_ntop()
,以便它知道如何解释您传递给它的数据:
struct sockaddr_in sa;
inet_ntop(AF_INET, &(sa.sin_addr), ...);
.
struct sockaddr_in6 sa;
inet_ntop(AF_INET6, &(sa.sin6_addr), ...);
为了帮助您编写与系列无关的代码,您应该尽可能直接使用 sockaddr_storage
而不是 sockaddr_in
或 sockaddr_in6
。 sockaddr_storage
的大小足以容纳 sockaddr_in
和 sockaddr_in6
结构。由于两个结构都以相同的偏移量和大小定义了一个家族字段,sockaddr_storage
可以与任何操作 sockaddr*
指针的 API 一起使用(connect()
、accept()
、bind()
、getsockname()
、getpeername()
等)。
然而,inet_ntop()
不属于这一类,所以在使用inet_ntop()
时,你必须手动拆开一个sockaddr_storage
,例如:
struct sockaddr_storage sa;
switch (sa.ss_family)
{
case AF_INET:
inet_ntop(AF_INET, &(((sockaddr_in*)&sa)->sin_addr), ...);
break;
case AF_INET6:
inet_ntop(AF_INET6, &(((sockaddr_in6*)&sa)->sin6_addr), ...);
break;
}
关于c - struct sockadr_in 不应该同时适用于 IPv4 和 IPv6 吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13157151/
目前部署在 Kubernetes 中的服务,通过 Calico BGP 将 Service 与集群外网络打通,并在外部的 nginx 中配置 Service 地址对外进行服务暴露。经过一段时间的观察
如发现here , 有一种新的 kube 服务是 IPVS 并且有很多负载均衡算法。 唯一的问题是我没有找到指定这些算法的位置。 我的理解: rr:循环法->循环调用后端pod lc:最少连接-> 将
我想尝试这种新的代理模式以及它为我们的一些应用程序提供的各种调度程序。到目前为止,我一直无法找到更改默认模式的方法 iptables至 ipvs在 GKE 节点上。 每个人都说通过--proxy-mo
我想在现有集群中为 IPVS 启用 Kube-proxy 模式。目前,它在 IPtables 上运行。如何在不影响现有工作负载的情况下将其更改为 IPVS? 我已经安装了所有必需的模块来启用它。另外,
我正在开发的应用程序作为 Kubernetes 集群中的部署运行。为此部署创建的 Pod 分布在集群中的各个节点上。我们的应用程序一次只能处理一个 TCP 连接,并且会拒绝进一步的连接。目前,我们使用
我是一名优秀的程序员,十分优秀!