sockets - 在 IPv6 套接字上使用 `sendto()` 发送到 IPv4 地址

标签 sockets portability ipv6 freebsd ipv4

我有一个 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/

相关文章:

c - 从 url 解析 ipv6 地址

kubernetes - 如何列出Kubernetes服务的IPv6?

java - 页面刷新时"Address already in use"

c# - 获取 tcp 套接字序列号和 ack 号

linux - C++.a : what affects portability across distros?

asp.net - Server2Go 就像 ASP.NET 一样,是一个可移植 ASP.NET 服务器

java - 如何在 Socket 游戏服务器上组织命令/处理程序?

c# - 通过套接字连接发送多个请求

c++ - Hadoop 的可移植键值数据文件格式?

regex - 匹配有效 IPv6 地址的正则表达式