//ipv4 addr
u_char sin_len;
u_char sin_family;
u_short sin_port;
struct in_addr sin_addr;
char sin_zero[8];
};
u_int32_t s_addr;
}
u_char sin6_len;
u_char sin6_family;
u_int16_t sin6_port;
u_int32_t sin6_flowinfo;
struct in6_addr sin6_addr;
u_int32_t sin6_scope_id;
}
u_int8_t __u6_addr8[16];
}
IPV6地址類型(in6_addr)是一個結構變量,不能用常量爲結構變量賦值,但常量可以 用於初始化這個結構,全球變量in6addr_any可以在賦值中使用,如
sin6.sin6_addr=in6addr_any;
struct in6_addr anyaddr=IN6ADDR_ANY_INIT;
在IPV4中的connect(),send()和sendmsg()函數調用中,使用常量INADDR_LOOPBACK來 和本地節點中的服務進行通信。對於IPV6的迴環,全局變量(in6addr_loopback)在賦值中 使用,常量(IN6ADDR_LOOPBACK_INIT)用於在聲明時的初始化。注意,IPV4的INADDR_XXX常量以主機字節順序定義,而IPV6的以網絡字節順序定義
connect()
send()
sendto()
recvfrom()
recv()
getpeername()
getsockname()
更多信息請參考:RFC2553,RFC22925、名稱/地址的轉換 在IPV4中,應用程序使用gethostbyname()函數來將主機名解析爲一個或多個IP地址, 但它不允許調用者指定所需地址類型的任何信息,因此IPV6中引入一個名字getaddrinfo( )的新API,此API與協議無關,此調用的返回值是addrinfo的結構指針,以後可用它來打開 和使用套接字,getaddrinfo()原型如下:
int getaddrinfo(
IN const char FAR *nodename,
IN const char FAR *servname,
IN const struct addrinfo FAR *hints,
OUT struct addrinfo FAR *FAR *res
);
struct addrinfo {
int ai_flags; /* AI_PASSIVE, AI_CANONNAME, AI_NUMERICHOST */
int ai_family; /* PF_xxx */
int ai_socktype; /* SOCK_xxx */
int ai_protocol; /* 0 or IPPROTO_xxx for IPv4 and IPv6 */
size_t ai_addrlen; /* length of ai_addr */
char *ai_canonname; /* canonical name for nodename */
struct sockaddr *ai_addr; /* binary address */
struct addrinfo *ai_next; /* next structure in linked list */
};
int getnameinfo(
IN const struct sockaddr FAR *sa,
IN socklen_t salen,
OUT char FAR *host,
IN size_t hostlen,
OUT char FAR *serv,
IN size_t servlen,
IN int flags
);