1,作为Server端
类似于c#,IPv4/IPv6双协议栈环境中, 使用下面代码绑定到所有IP地址:
int ServSock, csock;
struct sockaddr addr, from;
...
ServSock = socket(AF_INET6, SOCK_STREAM, PF_INET6);
bind(ServSock, &addr, sizeof(addr));
do {
csock = accept(ServSocket, &from, sizeof(from));
doClientStuff(csock);
} while (!finished);
2,作为client端
类似c#,要想连接到IPv6服务器上,需指定ai_flags为 AI_ALL|AI_ADDRCONFIG。比如:
struct addrinfo *res, *aip;
struct addrinfo hints;
int sock = -1;
int error;
/* 获得服务器地址信息. */
bzero(&hints, sizeof(hints));
hints.ai_flags = AI_ALL|AI_ADDRCONFIG;
hints.ai_socktype = SOCK_STREAM;
error = getaddrinfo(hostname, servicename, &hints, &res);
if (error != 0) {
(void) fprintf(stderr,
"getaddrinfo: %s for host %s service %s\n",
gai_strerror(error), hostname, servicename);
return (-1);
}
/*尝试所有的地址,直到有一个成功 */
for (aip = res; aip != NULL; aip = aip->ai_next) {
/*
* 打开socket.地址的类型依赖于
* getaddrinfo()的返回
*/
sock = socket(aip->ai_family, aip->ai_socktype, aip->ai_protocol);
if (sock == -1) {
perror("socket");
freeaddrinfo(res);
return (-1);
}
/*连接到服务器. */
if (connect(sock, aip->ai_addr, aip->ai_addrlen) == -1) {
perror("connect");
(void) close(sock);
sock = -1;
continue;
}
break;
}
freeaddrinfo(res);





