linux – 套接字级别的IPv4和IPv6之间有什么区别吗?

linux – 套接字级别的IPv4和IPv6之间有什么区别吗?,第1张

概述我需要为现有的仅支持IPv4的基于套接字的应用程序添加IPv6支持.为了迎接即将到来的IPv6时代,有人命令我为应用程序添加IPv6接口,并在尝试与应用程序通信时让外界选择IPv4接口或IPv6接口. 我的问题是:对于Linux中的套接字处理API级别,处理基于IPv4的套接字和基于IPv6的套接字之间没有区别吗? 更多的是,是否可以让套接字侦听具有相同端口的两个IP地址?如果这是真的,那么实现这 我需要为现有的仅支持IPv4的基于套接字的应用程序添加IPv6支持.为了迎接即将到来的IPv6时代,有人命令我为应用程序添加IPv6接口,并在尝试与应用程序通信时让外界选择IPv4接口或IPv6接口.

我的问题是:对于Linux中的套接字处理API级别,处理基于IPv4的套接字和基于IPv6的套接字之间没有区别吗?

更多的是,是否可以让套接字侦听具有相同端口的两个IP地址?如果这是真的,那么实现这个要求是一项微不足道的工作,我想.

解决方法 用1个TCP套接字监听2个不同的IP地址是不可能的,但是如果你使用 in6addr_any地址监听所有接口,那么也将包括所有的IPv4地址(虽然我相信例如linux有一个内核选项来禁用该映射).

对于您是使用IPv4还是IPv6,(较新版本)套接字API非常透明,但必须非常谨慎地处理IPv4应用程序的编码方式.

例如此IPv4代码接受连接并打印出远程主机的地址:

struct sockaddr_in clIEnt_addr; socklen_t addr_len = sizeof(clIEnt_addr); clIEnt_data->fd = accept(server_fd,(struct sockaddr*)&clIEnt_addr,&addr_len); log_printf("New clIEnt from %s\n",inet_ntoa(clIEnt_addr.sin_addr.s_addr));

必须转换为以下内容,它处理IPv4和IPv6

struct sockaddr_storage clIEnt_addr; char numeric_addr[INET6_ADDRSTRLEN]; socklen_t addr_len = sizeof(clIEnt_addr); clIEnt_data->fd = accept(server_fd,&addr_len); if(clIEnt_addr.ss_family == AF_INET)    log_printf("New clIEnt from %s\n",inet_ntop(clIEnt_addr.ss_family,((struct sockaddr_in*)&clIEnt_addr)->sin_addr.s_addr,numeric_addr,sizeof numeric_addr)); else if(clIEnt_addr.ss_family == AF_INET6)    log_printf("New clIEnt from %s\n",((struct sockaddr_in6*)&clIEnt_addr)->sin6_addr,sizeof numeric_addr));

虽然我相信你可以用getaddrinfo()更优雅和透明地做到这一点

以下是有关IP层独立性的附加说明:
http://uw714doc.sco.com/en/SDK_netapi/sockC.PortIPv4appIPv6.html
http://www.kame.net/newsletter/19980604/

总结

以上是内存溢出为你收集整理的linux – 套接字级别的IPv4和IPv6之间有什么区别吗?全部内容,希望文章能够帮你解决linux – 套接字级别的IPv4和IPv6之间有什么区别吗?所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/yw/1033407.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存