我需要向现有的基于套接字的应用程序添加IPv6支持,该应用程序目前只支持IPv4。为了迎接即将到来的IPv6时代,有人命令我为应用程序添加一个IPv6界面,让外部世界在尝试与应用程序通信时选择IPv4界面或IPv6界面。
我的问题是:对于Linux中的套接字处理API级别,处理基于IPv4的套接字和基于IPv6的套接字没有区别,这是真的吗?
此外,是否可以让套接字监听具有相同端口的两个IP地址?如果这是真的,那么实现需求是一项微不足道的工作,我想。
发布于 2010-03-02 00:07:20
用一个TCP套接字监听两个不同的IP地址是不可能的,但是如果你使用in6addr_any地址监听所有的接口,这将包括所有的IPv4地址(尽管我相信例如linux有一个内核选项来禁用该映射)。
对于您使用的是IPv4还是IPv6,(较新版本的) socket 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,(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/
发布于 2010-03-02 00:04:59
IPv4和IPv6的套接字处理在很大程度上是相同的。在服务器上,一旦绑定了地址,对listen、accept、recv和send的调用对于IPv4和IPv6连接都将是相同的。
但任何处理地址的函数,如connect、bind、getsockname、getpeername,都需要修改,因为您需要使用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。
发布于 2010-03-06 16:39:06
Beej的网络编程指南解决了IPv4和IPv6在编码方面的差异。http://beej.us/guide/bgnet/
他专门用了一个章节来修改您现有的IPv4代码来处理IPv6。
他还解释了如何在套接字级别进行抽象编码,以便您不需要知道您正在处理的是IPv4地址还是IPv6。
https://stackoverflow.com/questions/2356915
复制相似问题