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

时间:2011-11-10 22:49:38

标签: 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上,当我发送到IPv4地址时,我收到错误Address family not supported by protocol family

有没有办法配置FreeBSD来接受这个? 可能类似于ipv6_ipv4mapping="YES"来监听IPv4客户端吗?

1 个答案:

答案 0 :(得分:3)

您正在创建IPv6套接字,因此您必须使用IPv6地址。但是,如果您的操作系统支持双栈套接字(即,在单个套接字上本机支持IPv4和IPv6),则使用IPv4-mapped IPv6 address发送到IPv4地址(如果操作系统允许,有些则不允许) 。否则,您必须为IPv4和IPv6使用单独的套接字。