Table of Contents
ipv6 socket编程实践
- ip地址长度变化,按照ipv4 255.255.255.255的地址格式,最长为15,加上结束符16字节长度;ipv6
的地址格式为XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX:XXXX,最长为39,加上结束符为40字节长度。 - struct sockaddr变化为struct sockaddr_storage
这个结构体变化在getpeername和getsockname两个函数中使用,虽然manual中给出的入参类型还是
struct sockaddr,但是在ipv6中,需要使用struct sockaddr_storage struct sockaddr_in变化为struct sockaddr_in6
在inet_*函数中使用,如:- sin_addr –> sin6_addr
inet_ntop(AF_INET6, &sock_addr_in6.sin6_addr, peerAddrV6, sizeof(peerAddrV6)); */ ipv6
peerAddr = (UINT8 *)inet_ntoa(sock_addr_in.sin_addr); /* ipv4 - sin_port –> sin6_port
fromV6.sin6_port = htons(TcpLinkCB[dwIndex].lPort); */ ipv6
from.sin_port = htons(TcpLinkCB[dwIndex].lPort); /* ipv4
- sin_addr –> sin6_addr
inet_addr –> inet_pton
TcpLinkCB[dwIndex].dwIPAddr = inet_addr(tmp); */ ipv4
inet_pton(AF_INET6, tmp, &TcpLinkCB[dwIndex].in6peerIPAddr); /* ipv6- socket入参变化 AF_INET –> AF_INET6
skt = socket(AF_INET6, SOCK_STREAM, 0); */ ipv6
skt = socket(AF_INET, SOCK_STREAM, 0); /* ipv4
also: PF_INET –> PF_INET6 - bind函数入参变化
bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr)) –>
bind(sockfd, (struct sockaddr *) &my_addr, sizeof(struct sockaddr_in6) INADDR_ANY –> in6addr_any
struct sockaddr_in sa;
struct sockaddr_in6 sa6;sa.sin_addr.s_addr = INADDR_ANY; */ use my IPv4 address
sa6.sin6_addr = in6addr_any; /* use my IPv6 addressfromV6.sin6_family = AF_INET6; */ ipv6
from.sin_family = AF_INET; /* ipv4- struct in6_addr可以使用IN6ADDR_ANY_INIT初始化
struct in6_addr ia6 = IN6ADDR_ANY_INIT;
示例程序
ipv6
ipv6 tcp server
#include <stdio.h> #include <stdlib.h> #include <errno.h> #include <string.h> #include <sys/types.h> #include <netinet/in.h> #include <sys/socket.h> #include &