Sockets 在IPv6套接字上使用“sendto()”发送到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地址(“192.168.1.33”和目的地址sin6地址); sendto(sockfd,message,strlen(message)+1,0,(struct sockaddr*)和dest_addr,sizeof(struct sockaddr_in6));

Sockets 在IPv6套接字上使用“sendto()”发送到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地址(“192.168.1.33”和目的地址sin6地址); sendto(sockfd,message,strlen(message)+1,0,(struct sockaddr*)和dest_addr,sizeof(struct sockaddr_in6));,sockets,portability,ipv6,freebsd,ipv4,Sockets,Portability,Ipv6,Freebsd,Ipv4,在Linux上,这很好,但在FreeBSD上,当我发送到IPv4地址时,我收到一个协议系列不支持的错误地址系列 有没有办法配置FreeBSD来接受这个? 可能类似于侦听IPv4客户端的ipv6\u ipv4mapping=“YES”。您正在创建ipv6套接字,因此必须使用ipv6地址。但是,如果您的操作系统支持双堆栈套接字(即,在单个套接字上本机同时支持IPv4和IPv6),则使用发送到IPv4地址(如果操作系统允许,有些则不支持)。否则,你必须为IPv4 AND IPv6使用单独的套接字。<

在Linux上,这很好,但在FreeBSD上,当我发送到IPv4地址时,我收到一个协议系列不支持的错误
地址系列

有没有办法配置FreeBSD来接受这个?
可能类似于侦听IPv4客户端的ipv6\u ipv4mapping=“YES”

您正在创建ipv6套接字,因此必须使用ipv6地址。但是,如果您的操作系统支持双堆栈套接字(即,在单个套接字上本机同时支持IPv4和IPv6),则使用发送到IPv4地址(如果操作系统允许,有些则不支持)。否则,你必须为IPv4 AND IPv6使用单独的套接字。< /P>最好是有一个用于IPv4的套接字,一个用于IPv6。@ Paolo:两个原因。)它很好地符合现有的(IPv4)程序结构;b)应用程序已经使用了数百个socket,而我不想把它加倍。在C++中,你只需要<代码>(SockAdDR*)。,而不是
(struct sockaddr*)
Linux似乎不这么看,代码运行良好。我希望FreeBSD能有一个更轻松的切换。@GeneVincent-我对FreeBSD不熟悉,但我的印象是将其更改为
inet\u pton(“::ffff:192.168.1.33,&dest…”)应该可以在FreeBSD@awoodland:当然可以,但这意味着要转换每个地址。系统范围内切换到Linux行为会更好地满足我的需要,但我想我必须进行转换。@GeneVincent-我的建议是使用您自己的函数替换对
inet\u pton
的调用,该函数可以插入
”::ffff:“
(根据需要)”。