首页 > 编程知识 正文

ipv4和ipv6的选哪个,c语言套接字编程

时间:2023-05-04 20:31:06 阅读:205828 作者:2350

我有一个UDP服务器,它必须在IPV4和IPV6地址上为客户端提供服务。我创建了一个IPV6套接字来为IPV4和IPV6客户端提供服务。

服务器在第一次通信时存储客户机的IP地址。如果它是IPV4客户端,则它存储为IPV4地址,如果它是IPV6客户端,则该服务器将存储为IPV6地址。对于将来的所有通信,它会检查存储器是否已知(存储)该客户端,然后进行相应的操作。为了比较客户端地址和存储的地址,我根据家庭类型(AF_INET和AF_INET6)做了一个memcmp。当与IPV6客户端通信时,系统正常工作,但在与IPV4客户端通信时,系统表现得好像从来不知道客户。在调试过程中,我发现由于IPV6是Socket Type,因此IPV4客户端的IP地址被作为IPV6映射的IPV4地址接收,而IPV6地址族被设置为IPV6。为了解决这个问题,我需要比较IPV4存储地址和IPV6映射地址。为此,我使用IPV4结构的sin_addr.s_addr和IPV6结构的sin6_addr.in6_u.u6_addr32。请找到下面的代码片段。

ipv6_clientdata = (const struct sockaddr_in6 *)&sockStor;

ipv4_storeddata = (const struct sockaddr_in *)&(_stData[index].clientaddr);

if( (ipv6_clientdata->sin6_port == ipv4_storeddata->sin_port) &&

(ipv6_clientdata->sin6_addr.in6_u.u6_addr32[3] == ipv4_storeddata->sin_addr.s_addr)

)

{

addrfound = true;

}我想知道这种方法是否是将IPV6映射IPV4地址与IPV4地址进行比较的合适解决方案,还是有其他更好的方法。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。