提交 b73fde09 编写于 作者: xc13262215230's avatar xc13262215230

[getaddrinfo_2采用for循环获取ip列表]

上级 46516697
......@@ -610,6 +610,8 @@ function onGET(evt) { // 数据请求
113.编码建议:
在服务端开发尽量避免std::string, 而采用char*进行代替。
114.
IPV4&IPV6
TCP&UDP
......@@ -10,7 +10,7 @@ class MyHttpClient : public TcpHttpClient
public:
MyHttpClient() // 构造函数
{
//pClient->InitSocket(AF_INET, 10240, 10240);
InitSocket(AF_INET, 10240, 10240);
}
virtual ~MyHttpClient() // 虚析构函数
......@@ -38,28 +38,43 @@ public:
{
if (nullptr == hostname) {
Log::Warring("HostName2Ip, nullptr == hostname."); // 警告提醒,不一定是错误
return -1; // 0-success 负数-failed
return -1; // 0->success -1->failed
}
addrinfo hints = {};
hints.ai_family = AF_UNSPEC; // ipv6-AF_INET6, ipv4-AF_INET, AF_UNSPEC-任意
hints.ai_socktype = SOCK_STREAM; // socket stream
addrinfo* pAddrList = nullptr; // 存储获取的IP, 有可能有很多IP
int ret = getaddrinfo(hostname, nullptr, nullptr, &pAddrList); // 从域名中获取IP信息
int ret = getaddrinfo(hostname, nullptr, &hints, &pAddrList); // 从域名中获取IP信息
if (0 != ret) {
Log::PError("getaddrinfo!"); // 获取系统发生的最后一个错误,可跨平台
Log::PError("%s getaddrinfo!", hostname); // 获取系统发生的最后一个错误,可跨平台
// 分析:win系统采用unicode字符集输出存在乱码,应该采用多字节字符集
printf("getaddrinfo error: %s, [ret=%d]\n", gai_strerror(ret), ret); // 与方法getaddrinfo匹配的一个方法,功能同上
return ret; // bug????
// 分析2:ret是当前函数的临时变量,如果采用Log::Info打印,其日志打印机制
// 是采用了一个独立打印线程实现的,就是将临时变量传入到了另外的线程,临时变量
// 在执行流出了当前作用域就会被系统回收,另外的线程在打印的时候,访问这个已经
// 被系统析构的临时变量,就发生了不可预知行为。
//printf("getaddrinfo error: %s, [ret=%d]\n", gai_strerror(ret), ret); // 与方法getaddrinfo匹配的一个方法,功能同上
freeaddrinfo(pAddrList);
return ret; // 返回错误码
}
char ipStr[256] = { 0 }; // 存储最终被我们见到的ip形式: ip字符串
ret = getnameinfo(pAddrList->ai_addr, pAddrList->ai_addrlen, ipStr, 255, nullptr, 0, NI_NUMERICHOST);
if (0 != ret) {
Log::PError("getnameinfo!");
}
else {
printf("ip: [%s]\n", ipStr);
}
for (auto pAddr = pAddrList; pAddr != nullptr; pAddr = pAddr->ai_next) { // pAddr = pAddrList->ai_next // bug???
char ipStr[256] = { 0 }; // 存储最终被我们见到的ip形式: ip字符串
ret = getnameinfo(pAddr->ai_addr, pAddr->ai_addrlen, ipStr, 255, nullptr, 0, NI_NUMERICHOST);
if (0 != ret) {
Log::PError("%s getnameinfo!", hostname);
freeaddrinfo(pAddrList);
return ret;
}
else {
Log::Info("%s ip: [%s]", hostname, ipStr);
}
}
freeaddrinfo(pAddrList); // 与getaddrinfo配套使用
return ret;
}
......@@ -78,6 +93,9 @@ int main(int argc, char* args[])
MyHttpClient httpClient; // 创建对象[在栈上实例化对象,对象由系统自动析构]
//httpClient.Get("www.dosfu.com/add.php?a=1&b=2"); // 请求数据[域名可以解析成ip+port]
httpClient.Get("www.dosfu.com"); // 请求数据[域名可以解析成ip+port]
httpClient.Get("ipv4.dosfu.com");
httpClient.Get("ipv6.dosfu.com");
httpClient.Get("dosfu.com");
httpClient.Close(); // 关闭
......
Info [2023-12-17 17:55:53]Log::setLogPath success,<clientLog.txt,w>
PError [2023-12-17 17:55:53]getaddrinfo!
PError [2023-12-17 17:55:53]errno:10093, errmsg: 应用程序没有调用 WSAStartup,或者 WSAStartup 失败。
Info [2023-12-21 22:27:35]Log::setLogPath success,<clientLog.txt,w>
PError [2023-12-21 22:27:36]www.dosfu.com getaddrinfo!
PError [2023-12-21 22:27:36]errno:11001, errmsg: 不知道这样的主机。
PError [2023-12-21 22:27:36]ipv4.dosfu.com getaddrinfo!
PError [2023-12-21 22:27:36]errno:11001, errmsg: 不知道这样的主机。
Info [2023-12-21 22:27:36]ipv6.dosfu.com ip: [fe80::6ce2:8493:4d:1a60%5]
PError [2023-12-21 22:27:36]dosfu.com getaddrinfo!
PError [2023-12-21 22:27:36]errno:11001, errmsg: 不知道这样的主机。
Info [2023-12-21 22:27:36]~Client[sId=-1 id=1 socket=448]
Info [2023-12-21 22:27:36]Client::Destory[sId=-1 id=1 socket=448]
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册