我有一个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上,当我发送到IPv4地址时,我收到错误Address family not supported by protocol family
。
有没有办法配置FreeBSD来接受这个?
可能类似于ipv6_ipv4mapping="YES"
来监听IPv4客户端吗?
答案 0 :(得分:3)
您正在创建IPv6套接字,因此您必须使用IPv6地址。但是,如果您的操作系统支持双栈套接字(即,在单个套接字上本机支持IPv4和IPv6),则使用IPv4-mapped IPv6 address发送到IPv4地址(如果操作系统允许,有些则不允许) 。否则,您必须为IPv4和IPv6使用单独的套接字。