1. 通信地址类封装测试

1.1 通过域名解析获取到相应的网址

目的:是否能通过域名解析获取到的对应的网址信息。
test_addr.cpp:

  1. static Logger::ptr g_logger = KIT_LOG_ROOT();
  2. void test()
  3. {
  4. std::vector<Address::ptr> addrs;
  5. bool val = Address::LookUp(addrs, "www.baidu.com");
  6. if(!val)
  7. {
  8. KIT_LOG_ERROR(g_logger) << "Address::LookUp error!";
  9. return;
  10. }
  11. //打印解析获取到的地址
  12. for(size_t i = 0; i < addrs.size();++i)
  13. {
  14. KIT_LOG_INFO(g_logger) << i << "--" << addrs[i]->toString();
  15. }
  16. }
  17. int main()
  18. {
  19. KIT_LOG_INFO(g_logger) << "test begin";
  20. test();
  21. KIT_LOG_INFO(g_logger) << "test end";
  22. return 0;
  23. }

image.png

疑惑:同样的地址出现了三组是为什么?

返回的协议类型protocol不相同。image.png

如果我们指定流式套接字就没有重复了

image.png

指定请求服务看是否能解析出对应的端口号

  • www.baidu.com:http``www.baidu.com:https www.baidu.com:ftp

image.png
image.pngimage.png

1. 2 通过网卡获取相应的网址信息

目的:是否能通过网卡获取到对应的网址信息。

  • test_addr.cpp: ```cpp void test2() { std::multimap > mp;

    if(!Address::GetInertfaceAddresses(mp)) {

    1. KIT_LOG_ERROR(g_logger) << "Address::GetInertfaceAddresses error";
    2. return;

    }

    //将获取到的网址信息 逐一打印 for(auto &x : mp) {

    1. KIT_LOG_INFO(g_logger) << x.first << "--" << x.second.first->toString() << "/" << x.second.second;

    }

}

int main() { KIT_LOG_INFO(g_logger) << “test begin”; test2(); KIT_LOG_INFO(g_logger) << “test end”;

  1. return 0;

}

  1. 在没有特别指定IPv4IPv6的情况下都会打印出来<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/25460685/1645084077135-53ae4d36-19e5-471d-84bb-4824d78bd934.png#clientId=u06353b54-71b3-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=126&id=u668a9e4d&margin=%5Bobject%20Object%5D&name=image.png&originHeight=126&originWidth=1052&originalType=binary&ratio=1&rotation=0&showTitle=false&size=27102&status=done&style=none&taskId=u1483a1a2-a160-47c9-8365-2a3504a4515&title=&width=1052)<br />![image.png](https://cdn.nlark.com/yuque/0/2022/png/25460685/1645084137272-cb8f2b43-8f35-47e3-9865-8d394253b2db.png#clientId=u06353b54-71b3-4&crop=0&crop=0&crop=1&crop=1&from=paste&height=319&id=uf19f8b63&margin=%5Bobject%20Object%5D&name=image.png&originHeight=319&originWidth=662&originalType=binary&ratio=1&rotation=0&showTitle=false&size=39057&status=done&style=none&taskId=u2c9d78d5-92fe-4394-88f8-1346cb0fbe6&title=&width=662)
  2. <a name="nM0BE"></a>
  3. ## 1.3 通过网址解析IPv4相应信息
  4. 目的:IPv4相关功能是否正常,解析广播地址、网段、子网掩码等。
  5. - `test_addr.cpp`:
  6. ```cpp
  7. void test_ipv4()
  8. {
  9. std::multimap<std::string, std::pair<Address::ptr, uint32_t> > mp;
  10. if(!Address::GetInertfaceAddresses(mp))
  11. {
  12. KIT_LOG_ERROR(g_logger) << "Address::GetInertfaceAddresses error";
  13. return;
  14. }
  15. for(auto &x : mp)
  16. {
  17. auto addr = std::dynamic_pointer_cast<IPAddress>(x.second.first);
  18. if(addr->getAddr()->sa_family == AF_INET)
  19. KIT_LOG_INFO(g_logger) << x.first << "--" << x.second.first->toString() << "/" << x.second.second << ", 广播地址:" << addr->broadcastAddress(x.second.second)->toString() << ", 子网地址:" << addr->subnetAddress(x.second.second)->toString();
  20. }
  21. }
  22. int main()
  23. {
  24. KIT_LOG_INFO(g_logger) << "test begin";
  25. test_ipv4();
  26. KIT_LOG_INFO(g_logger) << "test end";
  27. return 0;
  28. }

image.png
image.png

2. Socket类封装测试

目的:观察封装的socket 相关一系列API是否正常。

  • test_socket.cpp

域名转IP地址:Address::LookUpAnyIPAddress("www.baidu.com");
指定地址创建一个TCP连接:Socket::CreateTCP(addr);
连接指定地址的远端服务:sock->connect(addr)
发送数据:sock->send(buf, sizeof(buf));
接收数据:sock->recv(&temp[0], temp.size());

  1. static Logger::ptr g_logger = KIT_LOG_ROOT();
  2. void test_socket()
  3. {
  4. //获取百度的通信地址
  5. IPAddress::ptr addr = Address::LookUpAnyIPAddress("www.baidu.com");
  6. if(addr)
  7. {
  8. KIT_LOG_INFO(g_logger) << "get address=" << addr->toString();
  9. }
  10. else
  11. {
  12. KIT_LOG_ERROR(g_logger) << "get addr fail";
  13. }
  14. Socket::ptr sock = Socket::CreateTCP(addr);
  15. addr->setPort(80);
  16. if(!sock->connect(addr))
  17. {
  18. KIT_LOG_ERROR(g_logger) << "connect:" << addr->toString() << " fail";
  19. }
  20. else
  21. {
  22. KIT_LOG_INFO(g_logger) << "connect:" << addr->toString() << " success";
  23. }
  24. //对百度发起一个HTTP请求
  25. const char buf[] =
  26. "GET / HTTP/1.0\r\n"
  27. "host: www.baidu.com\r\n"
  28. "\r\n";
  29. int ret = sock->send(buf, sizeof(buf));
  30. if(ret <= 0)
  31. {
  32. KIT_LOG_ERROR(g_logger) << "send fail ret = " << ret;
  33. return;
  34. }
  35. std::string temp;
  36. temp.resize(10 * 1024);
  37. ret = sock->recv(&temp[0], temp.size());
  38. if(ret < 0)
  39. {
  40. KIT_LOG_ERROR(g_logger) << "recv fail ret = " << ret;
  41. return;
  42. }
  43. std::cout << "size:" << ret << std::endl;
  44. std::cout << "recv msg:\n" << temp << std::endl;
  45. }
  46. int main()
  47. {
  48. KIT_LOG_DEBUG(g_logger) << "test begin";
  49. IOManager iom;
  50. iom.schedule(&test_socket);
  51. KIT_LOG_DEBUG(g_logger) << "test end";
  52. return 0;
  53. }

image.png