Socket Programming下IPv6的支持
来源:互联网 发布:笔试算法题 编辑:程序博客网 时间:2024/05/17 03:18
在IPV6大势所趋下,我们不得不考虑扩展现有的程序,让它也支持ipv6。本篇主要针对socket下ipv4到ipv6的移植相关内容。 一、区别之处 1)地址结构 ipv4地址结构: ipv6地址结构: 举例: ipv4地址赋值: rcv_udp_addr.sin_family = AF_INET; ipv6地址赋值: rcv_udp_addr.sin6_family = PF_INET6; 注意那个ipv4的INADDR_ANY是主机字节序,而in6addr_any为网络字节序 int socket(int domain, int type, int protocol); ipv4中字符串地址转换为网络序ip地址使用函数inet_aton,而ipv6使用inet_pton int inet_aton(const char *cp, struct in_addr *inp); 例: char *inet_ntoa(struct in_addr in); 例: ipv4使用gethostbyname和gethostbyaddr 例: 使用ipv6需要包含:
struct sockaddr_in {
short int sin_family; //地址族
unsigned short int sin_port; //端口号
struct in_addr sin_addr; //地址
unsigned char sin_zero[8];
};
struct in_addr {
unsigned long s_addr;
};
struct sockaddr_in6{
uint8_t sin6_len; //IPv6 为固定的(9php.com)24 字节长度
sa_family_t sin6_family; //地址簇类型,为AF_INET6
in_port_t sin6_port; //16 位端口号,网络字节序
uint32_t sin6_flowinfo; //32 位流标签
struct in6_addr sin6_addr; //128 位IP 地址
}
rcv_udp_addr.sin_addr.s_addr = htonl(INADDR_ANY);
rcv_udp_addr.sin_port = htons(UDPRCV_PORT);
rcv_udp_addr.sin6_addr = in6addr_any;
rcv_udp_addr.sin6_port = htons(UDPRCV_PORT);
2)socket建立
差别在于ipv4时,第一个参数为AF_INET,而ipv6时,第一个参数为AF_INET6
sock_tcp = socket(AF_INET, SOCK_STREAM, 0)//ipv4
sock_tcp = socket(PF_INET6, SOCK_STREAM, 0)//ipv6
3)字符串地址和网络序ip地址的相互转换:
int inet_pton(int af, const char *src, void *dst);
inet_pton(AF_INET6, hostname, &snd_tcp_addr.sin6_addr)
其中hostname为c类型字符串ip地址
相反的转换ipv4使用inet_ntoa,而ipv6使用inet_ntop
const char *inet_ntop(int af, const void *src, char *dst, socklen_t cnt);
inet_ntop(PF_INET6,&rcv_udp_addr.sin6_addr,ip,sizeof(ip));
其中ip为c风格字符串
4)主机名和地址的转换
而通用采用的是getaddrinfo和getnameinfo
getaddrinfo(ipaddr, port,&hints,&res);
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
一个例子
char IPdotdec[20]; //存放点分十进制IP地址
struct in_addr s; // IPv4地址结构体
int main (void)
{
// 输入IP地址
printf("Please input IP address: ");
scanf("%s", &IPdotdec);
// 转换
inet_pton(AF_INET, IPdotdec, (void *)&s);
printf("inet_pton: 0x%x/n", s.s_addr); // 注意得到的字节序
// 反转换
inet_ntop(AF_INET, (void *)&s, IPdotdec, 16);
printf("inet_ntop: %s/n", IPdotdec);
}
- Socket Programming下IPv6的支持
- C++创建支持IPv4/IPv6的Socket
- socket 支持 ipv6
- Unity IPv6 Socket 支持
- linux 下 IPV6 socket 通讯的程序
- 升级支持ipv4/ipv6后的Socket处理(cocos2dx项目苹果审核支持ipv6处理二)
- Unity ipv6的支持
- ipv6的兼容性支持
- IPv6下网络编程socket
- IPV6下Socket网络编程
- LINUX 下 ipv6 socket 编程
- 【Socket编程】Linux下的IPv6 socke编程
- c#让Socket服务支持IPv6
- IPv6下网络编程socket, TCP和UDP例子,以及兼容IPV4和IPV6的类
- IPv6下网络编程socket, TCP和UDP例子,以及兼容IPV4和IPV6的类
- android java 在同时支持ipv4 与 ipv6 状况下,仅支持ipv4 或 ipv6的方法(测试中)
- linux c socket之通用socket,支持ipv4和ipv6
- 让阿里云支持IPv6以及Socket.io的相关改动笔记
- sap 国际化配置事务码(I18N)
- 常用的一些字符了,什么的使用。
- 正则表达式的贪婪与懒惰
- 数据库建模 (范式)
- 函数生成的ALV的按钮列表
- Socket Programming下IPv6的支持
- function模式的ALV如何响应单击事件
- Flash Player 10.1内部机制(第二部分) - 执行模型之可变跑道
- 顶级程序员的心得 Coders at Work (II)
- HDU 3304 求杨辉三角第N行中能被素数P整除的数的个数
- c++中初始化和赋值的区别
- function模式设置ALV用弹出窗口显示
- python 工具
- alv 可编辑列为数量,但更改数量后变成小数了