我有一个 C++ 应用程序,它使用相同的 IPv6 UDP 套接字发送到 IPv6 或 IPv4 目的地。
sockfd = socket(PF_INET6, SOCK_DGRAM, 0);
dest_addr.sin6_family = AF_INET;
dest_addr.sin6_port = htons(dest_port);
inet_pton ("192.168.1.33", &dest_addr.sin6_addr);
sendto (sockfd, message, strlen(message)+1, 0, (struct sockaddr *)&dest_addr, sizeof(struct sockaddr_in6));
在 Linux 上这工作正常,但在 FreeBSD 上我收到错误
Address family not supported by protocol family
当我发送到 IPv4 地址时。有没有办法配置 FreeBSD 来接受这个?
可能类似于
ipv6_ipv4mapping="YES"
用于监听 IPv4 客户端?
最佳答案
您正在创建一个 IPv6 套接字,因此您必须使用 IPv6 地址。但是,如果您的操作系统支持双栈套接字(即,在单个套接字上 native 支持 IPv4 和 IPv6),则使用 IPv4-mapped IPv6 address发送到 IPv4 地址(如果操作系统允许,有些则不允许)。否则,您必须为 IPv4 和 IPv6 使用单独的套接字。
关于sockets - 在 IPv6 套接字上使用 `sendto()` 发送到 IPv4 地址,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8087478/