首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >IPv4和IPv6在套接字级别上有什么不同吗?

IPv4和IPv6在套接字级别上有什么不同吗?
EN

Stack Overflow用户
提问于 2010-03-01 23:38:36
回答 5查看 11.2K关注 0票数 10

我需要向现有的基于套接字的应用程序添加IPv6支持,该应用程序目前只支持IPv4。为了迎接即将到来的IPv6时代,有人命令我为应用程序添加一个IPv6界面,让外部世界在尝试与应用程序通信时选择IPv4界面或IPv6界面。

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

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

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2010-03-02 00:07:20

用一个TCP套接字监听两个不同的IP地址是不可能的,但是如果你使用in6addr_any地址监听所有的接口,这将包括所有的IPv4地址(尽管我相信例如linux有一个内核选项来禁用该映射)。

对于您使用的是IPv4还是IPv6,(较新版本的) socket API是相当透明的,但是必须非常小心地注意IPv4应用程序通常是如何编码的。

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

代码语言:javascript
复制
 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

代码语言:javascript
复制
 struct sockaddr_storage client_addr;
 char numeric_addr[INET6_ADDRSTRLEN];
 socklen_t addr_len = sizeof(client_addr);
 client_data->fd = accept(server_fd,(struct sockaddr*)&client_addr,&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",inet_ntop(client_addr.ss_family,((struct sockaddr_in6*)&client_addr)->sin6_addr ,numeric_addr,sizeof numeric_addr));

尽管我相信使用getaddrinfo()可以做得更优雅、更透明。

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

票数 6
EN

Stack Overflow用户

发布于 2010-03-02 00:04:59

IPv4和IPv6的套接字处理在很大程度上是相同的。在服务器上,一旦绑定了地址,对listenacceptrecvsend的调用对于IPv4和IPv6连接都将是相同的。

但任何处理地址的函数,如connectbindgetsocknamegetpeername,都需要修改,因为您需要使用sockaddr_in6。此外,您还需要修改使用address的函数(例如,需要将对inet_addr的调用更改为inet_pton)。

在Linux上,如果您绑定到in6addr_any,到该端口的IPv4和IPv6连接都将工作(尽管这将侦听超过2个地址,因为它还将侦听IPv4 loopback 127.0.0.1和IPv6 loopback ::1)。但在Windows上,我一直无法让它工作,我需要在一个套接字上监听IPv4,另一个套接字监听IPv6。

票数 5
EN

Stack Overflow用户

发布于 2010-03-06 16:39:06

Beej的网络编程指南解决了IPv4和IPv6在编码方面的差异。http://beej.us/guide/bgnet/

他专门用了一个章节来修改您现有的IPv4代码来处理IPv6。

他还解释了如何在套接字级别进行抽象编码,以便您不需要知道您正在处理的是IPv4地址还是IPv6。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2356915

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档