金色坐标

关注互联网和IT科技的个人博客

« .NET平台应用系统软件支持IPv4/IPv6IPv4/IPv6升级后的IP信息存储 »

C/C++应用系统升级支持IPv4/IPv6

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);




原创文章,如转载请注明:转载自金色坐标 [ http://www.kingxy.com/ ]

本文链接地址:http://www.kingxy.com/archives/54.html
  • 相关文章:
  • .NET平台应用系统软件支持IPv4/IPv6  (2008-12-19 17:33:59)

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

订阅博客

  • 订阅我的博客:订阅我的博客
  • 关注新浪微博:关注新浪微博
  • 关注腾讯微博:关注腾讯微博
  • 通过Google订阅本站
  • 通过鲜果订阅本站
  • 通过电子邮件订阅
  • 本站支持WAP访问

Search

Google

最新评论及回复

最近发表

金色坐标博客——京ICP备09009094号

本站采用创作共用版权协议, 要求署名、非商业用途和保持一致. 转载本站内容必须也遵循“署名-非商业用途-保持一致”的创作共用协议.
KingXY Blog - This site is licensed under a Creative Commons Attribution-NonCommercial-ShareAlike 2.5 License.