这里不再对IPv6 socket相关编程的基础知识进行讲解,只提供一个IP协议无关的服务端和客户端的代码,仅供参考。

服务端代码:

  1. #include <iostream>
  2. #include <string>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <arpa/inet.h>
  6. #include <netdb.h>
  7. #include <errno.h>
  8. #include <time.h>
  9. using namespace std;
  10. int tcp_listen(const char *host, const char *service, const int listen_num = 5)
  11. {
  12. int listenfd, ret;
  13. const int on = 1;
  14. struct addrinfo hints, *res, *ressave;
  15. bzero(&hints, sizeof(hints));
  16. hints.ai_flags = AI_PASSIVE;
  17. hints.ai_family = AF_UNSPEC;
  18. hints.ai_socktype = SOCK_STREAM;
  19. hints.ai_protocol = IPPROTO_IP;
  20. if (0 != (ret = getaddrinfo(host, service, &hints, &res)))
  21. {
  22. cout << "getaddrinfo error: " << gai_strerror(ret) << endl;
  23. return -1;
  24. }
  25. ressave = res;
  26. while(NULL != res)
  27. {
  28. if (-1 == (listenfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol)))
  29. {
  30. cout << "create socket error: " << strerror(errno) << endl;
  31. res = res->ai_next;
  32. continue;
  33. }
  34. if (-1 == setsockopt(listenfd, SOL_SOCKET, SO_REUSEADDR, &on, sizeof(on)))
  35. {
  36. cout << "setsockopt error: " << strerror(errno) << endl;
  37. close(listenfd);
  38. res = res->ai_next;
  39. continue;
  40. }
  41. if (-1 == bind(listenfd, res->ai_addr, res->ai_addrlen))
  42. {
  43. cout << "bind error: " << strerror(errno) << endl;
  44. close(listenfd);
  45. res = res->ai_next;
  46. continue;
  47. }
  48. if (-1 == listen(listenfd, listen_num))
  49. {
  50. cout << "listen error: " << strerror(errno) << endl;
  51. close(listenfd);
  52. res = res->ai_next;
  53. continue;
  54. }
  55. break;
  56. }
  57. freeaddrinfo(ressave);
  58. if (NULL == res)
  59. return -1;
  60. return listenfd;
  61. }
  62. int get_addrinfo(const struct sockaddr *addr, string &ip, in_port_t &port)
  63. {
  64. void *numeric_addr = NULL;
  65. char addr_buff[INET6_ADDRSTRLEN];
  66. if (AF_INET == addr->sa_family)
  67. {
  68. numeric_addr = &((struct sockaddr_in*)addr)->sin_addr;
  69. port = ntohs(((struct sockaddr_in*)addr)->sin_port);
  70. }
  71. else if (AF_INET6 == addr->sa_family)
  72. {
  73. numeric_addr = &((struct sockaddr_in6*)addr)->sin6_addr;
  74. port = ntohs(((struct sockaddr_in6*)addr)->sin6_port);
  75. }
  76. else
  77. {
  78. return -1;
  79. }
  80. if (NULL != inet_ntop(addr->sa_family, numeric_addr, addr_buff, sizeof(addr_buff)))
  81. ip = addr_buff;
  82. else
  83. return -1;
  84. return 0;
  85. }
  86. int main(int argc, char *argv[])
  87. {
  88. int listenfd, connfd;
  89. struct sockaddr_storage cliaddr;
  90. socklen_t len = sizeof(cliaddr);
  91. time_t now;
  92. char buff[128];
  93. if (2 == argc) //指定端口
  94. listenfd = tcp_listen(NULL, argv[1]);
  95. else if (3 == argc) //指定本地IP和端口
  96. listenfd = tcp_listen(argv[1], argv[2]);
  97. else
  98. {
  99. cout << "usage: " << argv[0] << " [<hostname/ipaddress>] <service/port>" << endl;
  100. return -1;
  101. }
  102. if (listenfd < 0)
  103. {
  104. cout << "call tcp_listen error" << endl;
  105. return -1;
  106. }
  107. while (true)
  108. {
  109. connfd = accept(listenfd, (struct sockaddr*)&cliaddr, &len);
  110. string ip = "";
  111. in_port_t port = 0;
  112. get_addrinfo((struct sockaddr*)&cliaddr, ip, port);
  113. cout << "client " << ip << "|" << port << " login" << endl;
  114. now = time(NULL);
  115. snprintf(buff, sizeof(buff) - 1, "%.24s", ctime(&now));
  116. write(connfd, buff, strlen(buff));
  117. close(connfd);
  118. }
  119. close(listenfd);
  120. return 0;
  121. }

客户端代码:

  1. #include <iostream>
  2. #include <string>
  3. #include <sys/types.h>
  4. #include <sys/socket.h>
  5. #include <arpa/inet.h>
  6. #include <netdb.h>
  7. #include <errno.h>
  8. #include <time.h>
  9. using namespace std;
  10. int tcp_connect(const char *host, const char *service)
  11. {
  12. int sockfd, ret;
  13. struct addrinfo hints, *res, *ressave;
  14. bzero(&hints, sizeof(hints));
  15. hints.ai_family = AF_UNSPEC;
  16. hints.ai_socktype = SOCK_STREAM;
  17. hints.ai_protocol = IPPROTO_IP;
  18. if (0 != (ret = getaddrinfo(host, service, &hints, &res)))
  19. {
  20. cout << "getaddrinfo error: " << gai_strerror(ret) << endl;
  21. return -1;
  22. }
  23. ressave = res;
  24. while (NULL != res)
  25. {
  26. if (-1 == (sockfd = socket(res->ai_family, res->ai_socktype, res->ai_protocol)))
  27. {
  28. cout << "create socket error: " << strerror(errno) << endl;
  29. res = res->ai_next;
  30. continue;
  31. }
  32. if (-1 == connect(sockfd, res->ai_addr, res->ai_addrlen))
  33. {
  34. cout << "connect error: " << strerror(errno) << endl;
  35. close(sockfd);
  36. res = res->ai_next;
  37. continue;
  38. }
  39. break;
  40. }
  41. freeaddrinfo(ressave);
  42. if (NULL == res)
  43. return -1;
  44. return sockfd;
  45. }
  46. int main(int argc, char *argv[])
  47. {
  48. int sockfd, n;
  49. char buff[128];
  50. struct sockaddr_storage cliaddr;
  51. if (3 != argc)
  52. {
  53. cout << "usage: " << argv[0] << " <hostname/ipaddress> <service/port>" << endl;
  54. return -1;
  55. }
  56. sockfd = tcp_connect(argv[1], argv[2]);
  57. if (sockfd < 0)
  58. {
  59. cout << "call tcp_connect error" << endl;
  60. return -1;
  61. }
  62. bzero(buff, sizeof(buff));
  63. while ((n = read(sockfd, buff, sizeof(buff) - 1) > 0))
  64. {
  65. cout << buff << endl;
  66. bzero(buff, sizeof(buff));
  67. }
  68. close(sockfd);
  69. return 0;
  70. }

编译:

g++ daytimesrv.cpp -o daytimesrv

g++ daytimecli.cpp -o daytimecli

运行举例:

服务端运行情况:

客户端运行情况:

以上客户端的请求与服务端的输出一一对应,客户端可以尝试用不同的IP去连接,然后观察服务端的输出,有助于理解底层的交互过程。

 
 

C++ IPv4与IPv6的兼容编码(转,出自http://blog.csdn.net/ligt0610/article/details/18667595)的更多相关文章

  1. Sublime Text3 离线安装Package Control并使用GBK编码 --转自https://blog.csdn.net/swhard/article/details/78930371

    1.关闭Sublime Text 3,去https://github.com/wbond/package_control/releases下载一个zip包,我下载的是 2.将包内的顶层文件夹解压至C: ...

  2. 稀疏编码(Sparse Coding)的前世今生(一) 转自http://blog.csdn.net/marvin521/article/details/8980853

    稀疏编码来源于神经科学,计算机科学和机器学习领域一般一开始就从稀疏编码算法讲起,上来就是找基向量(超完备基),但是我觉得其源头也比较有意思,知道根基的情况下,拓展其应用也比较有底气.哲学.神经科学.计 ...

  3. JavaScript在IE和Firefox(火狐)的不兼容问题解决方法小结 【转】http://blog.csdn.net/uniqer/article/details/7789104

    1.兼容firefox的 outerHTML,FF中没有outerHtml的方法. 代码如下: if (window.HTMLElement) { HTMLElement.prototype.__de ...

  4. ubuntu16.04 tomcat7安装和编码修改(转发:https://blog.csdn.net/zl544434558/article/details/76735564)

    有直接通过命令安装的,但是我还是喜欢把文件下载下来,然后自己配置. 1,下载tomcat7二进制文件 https://tomcat.apache.org/download-70.cgi 2,解压tom ...

  5. IPv4和IPv6的兼容问题

    一网络拓扑 Ipv6网络1 路由器A IPv4网络 路由器B IPv6网络2 二知识补充 [注]双协议栈主机(路由器A.B)通过域名解析器区分传过来的是IPv4还是IPv6 三处理技术 双协议栈 Ip ...

  6. ios 兼容IPV4和IPV6网络通信

    前言: 苹果官方出了新的规定,要求新上架的app都必须单独支持ipv6-only的网络. 准备工作: 搭建IPV6测试环境:http://blog.csdn.net/potato512/article ...

  7. VLC测试IPv4 IGMP/IPv6 MLD协议

    1 简述 VLC既可以充当流客户端,又可以充当流服务器,并且可以跨平台使用,是一款开源.免费的软件,基于GNU GPL许可证. 2 搭建组播服务器 第一步:运行程序后选择“媒体  串流”:第二步:通过 ...

  8. [转载]Linux网络编程IPv4和IPv6的inet_addr、inet_aton、inet_pton等函数小结

    转载:http://blog.csdn.net/ithomer/article/details/6100734 知识背景: 210.25.132.181属于IP地址的ASCII表示法,也就是字符串形式 ...

  9. Linux网络编程IPv4和IPv6的inet_addr、inet_aton、inet_pton等函数小结(转)

    原文:http://blog.csdn.net/ithomer/article/details/6100734 知识背景: 210.25.132.181属于IP地址的ASCII表示法,也就是字符串形式 ...

随机推荐

  1. socket心跳检测

    一.什么是心跳检测 判断对方(设备,进程或其它网元)是否正常动行,一般采用定时发送简单的通讯包,如果在指定时间段内未收到对方响应,则判断对方已经当掉.用于检测TCP的异常断开. 基本原因是服务器端不能 ...

  2. hdu5795 A Simple Nim 求nim求法,打表找sg值规律 给定n堆石子,每堆有若干石子,两个人轮流操作,每次操作可以选择任意一堆取走任意个石子(不可以为空) 或者选择一堆,把它分成三堆,每堆不为空。求先手必胜,还是后手必胜。

    /** 题目:A Simple Nim 链接:http://acm.hdu.edu.cn/showproblem.php?pid=5795 题意:给定n堆石子,每堆有若干石子,两个人轮流操作,每次操作 ...

  3. Linux虚拟机Centos 设置固定的静态IP

    经过两天的研究(研究到深夜1点),百度了很多文章与加了几个linux的群,终于得到一种方式是可以正常设置静态IP且正常的ssh连接的方式. 第一种方式:NAT模式 参考文章 -- 虚拟机中的CentO ...

  4. important——》sql server 2000安装图解

    MS Sql Server 2000包含两个部分:服务器组件和客户端工具,其中服务器组建是以Windows服务的方式运行的,有四种服务分别是:MSSqlServer.Distributed Trans ...

  5. js与jquery实时监听输入框值的oninput与onpropertychange方法

    文实例讲述了js与jquery实时监听输入框值的oninput与onpropertychange方法.分享给大家供大家参考.具体如下: 最近做过一个项目,需求是下拉框里自动匹配关键字,具体细节是实时监 ...

  6. 利用GetPrivateProfileString读取ini文件的字段

    //INIClass读取类 using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  7. poj 1548(最小路径覆盖)

    题目链接:http://poj.org/problem?id=1548 思路:最小路径覆盖是很容易想到的(本题就是求最小的路径条数覆盖所有的点),关键是如何建图,其实也不难想到,对于当前点,如果后面的 ...

  8. xshell ftp报错:找不到匹配的outgoing encryption算法

    场景:由于登陆跳板机都是从采用密钥的方式进行登陆的,然后在传输文件的时候报错 报错信息: 解决方案: 点击属性--->选择aes256-ctr加密方式默认这里是没有选择的 再次连接就成功连接上去 ...

  9. Android开发:《Gradle Recipes for Android》阅读笔记(翻译)3.2——设置Flavors和Variants

    问题: 需要构建大体上一样,但是使用不同资源或者类的应用. 解决方案: 产品的flavors可以帮助你对同一个app创建不同的版本. 讨论: build types是开发过程的一部分,一般用来将app ...

  10. Cocos2d-x Lua中使用标签

    游戏场景中的文字包括了静态文字和动态文字.静态文字如下图所示游戏场景中①号文字“COCOS2DX”,动态文字如图4-1所示游戏场景中的②号文字“Hello World”.静态文字一般是由美工使用Pho ...