diff --git a/src/ClusterNodesParser.h b/src/ClusterNodesParser.h index e17c0c8..15fbaf4 100644 --- a/src/ClusterNodesParser.h +++ b/src/ClusterNodesParser.h @@ -10,6 +10,8 @@ #include "Buffer.h" #include "String.h" #include "Server.h" +#include "arpa/inet.h" +#include "string.h" class ClusterNodesParser { @@ -55,6 +57,33 @@ class ClusterNodesParser end = mSlotEnd; return begin >= 0 && begin < end; } + bool validAddr() const { + if (mAddr.empty()) { + return false; + } + + const char* host = mAddr.data(); + const char* port = strrchr(mAddr, ':'); + if (port) { + std::string tmp; + tmp.append(mAddr, port - mAddr); + host = tmp.c_str(); + } + + char dst1[INET_ADDRSTRLEN]; + int isIpv4 = inet_pton(AF_INET, host, dst1); + if (isIpv4) { + return true; + } + + char dst2[INET6_ADDRSTRLEN]; + int isIpv6 = inet_pton(AF_INET6, host, dst2); + if (isIpv6) { + return true; + } + + return false; + } private: enum State { diff --git a/src/ClusterServerPool.cpp b/src/ClusterServerPool.cpp index 35591d2..a4b8c83 100644 --- a/src/ClusterServerPool.cpp +++ b/src/ClusterServerPool.cpp @@ -101,7 +101,7 @@ void ClusterServerPool::handleResponse(Handler* h, ConnectConnection* s, Request p.addr().data(), p.flags().data(), p.master().data()); - if (p.addr().empty()) { + if (!p.validAddr()) { logWarn("redis cluster nodes get node invalid %s %s %s %s", p.nodeId().data(), p.addr().data(),