This is an automated email from the ASF dual-hosted git repository. luchunliang pushed a commit to branch master in repository https://gitbox.apache.org/repos/asf/inlong.git
The following commit(s) were added to refs/heads/master by this push: new fad216ff9a [INLONG-9341][SDK] Optimize obtaining local IP information (#9342) fad216ff9a is described below commit fad216ff9a3b3dca3138871e131dbc84efb47cef Author: doleyzi <43397300+dole...@users.noreply.github.com> AuthorDate: Tue Nov 28 10:25:38 2023 +0800 [INLONG-9341][SDK] Optimize obtaining local IP information (#9342) * Optimize obtaining local IP information * Optimize obtaining local IP information --- .../dataproxy-sdk-cpp/release/inc/sdk_conf.h | 2 +- .../dataproxy-sdk-cpp/src/config/sdk_conf.cc | 67 ++++++++++++++++------ .../dataproxy-sdk-cpp/src/core/api_imp.cc | 3 +- 3 files changed, 53 insertions(+), 19 deletions(-) diff --git a/inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-cpp/release/inc/sdk_conf.h b/inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-cpp/release/inc/sdk_conf.h index aa451caee9..578278c5fd 100644 --- a/inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-cpp/release/inc/sdk_conf.h +++ b/inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-cpp/release/inc/sdk_conf.h @@ -40,7 +40,7 @@ private: void InitTcpParam(const rapidjson::Value &doc); void InitAuthParm(const rapidjson::Value &doc); void OthersParam(const rapidjson::Value &doc); - void InitLocalIp(); + bool GetLocalIPV4Address(std::string& err_info, std::string& localhost); public: // cache parameter diff --git a/inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-cpp/src/config/sdk_conf.cc b/inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-cpp/src/config/sdk_conf.cc index 70cd2362e2..e9d679cd8c 100644 --- a/inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-cpp/src/config/sdk_conf.cc +++ b/inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-cpp/src/config/sdk_conf.cc @@ -65,7 +65,14 @@ bool SdkConfig::ParseConfig(const std::string &config_path) { InitLogParam(doc); InitManagerParam(doc); InitTcpParam(doc); - InitLocalIp(); + + std::string err, local_ip; + if (GetLocalIPV4Address(err, local_ip)) { + local_ip_ = local_ip; + } else { + local_ip_ = constants::kSerIP; + } + OthersParam(doc); InitAuthParm(doc); @@ -469,24 +476,52 @@ void SdkConfig::OthersParam(const rapidjson::Value &doc) { } } -void SdkConfig::InitLocalIp() { - struct sockaddr_in dest; - dest.sin_family = AF_INET; - - int fd = socket(AF_INET, SOCK_DGRAM, 0); - if (fd <= 0) { - throw std::runtime_error(std::string("socket failed") + strerror(errno)); +bool SdkConfig::GetLocalIPV4Address(std::string& err_info, std::string& localhost) { + int32_t sockfd; + int32_t ip_num = 0; + char buf[1024] = {0}; + struct ifreq *ifreq; + struct ifreq if_flag; + struct ifconf ifconf; + + ifconf.ifc_len = sizeof(buf); + ifconf.ifc_buf = buf; + if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0) { + err_info = "Open the local socket(AF_INET, SOCK_DGRAM) failure!"; + return false; } - struct ifreq ifreq_Buf; - strcpy(ifreq_Buf.ifr_name, "eth1"); // just check the eth1 - if (-1 == ioctl(fd, SIOCGIFADDR, &ifreq_Buf)) { - throw std::runtime_error(std::string("ioctl failed") + strerror(errno)); - } + ioctl(sockfd, SIOCGIFCONF, &ifconf); + ifreq = (struct ifreq *)buf; + ip_num = ifconf.ifc_len / sizeof(struct ifreq); + for (int32_t i = 0; i < ip_num; i++, ifreq++) { + if (ifreq->ifr_flags != AF_INET) { + continue; + } + if (0 == strncmp(&ifreq->ifr_name[0], "lo", sizeof("lo"))) { + continue; + } + memcpy(&if_flag.ifr_name[0], &ifreq->ifr_name[0], sizeof(ifreq->ifr_name)); + if ((ioctl(sockfd, SIOCGIFFLAGS, (char *) &if_flag)) < 0) { + continue; + } + if ((if_flag.ifr_flags & IFF_LOOPBACK) + || !(if_flag.ifr_flags & IFF_UP)) { + continue; + } - close(fd); - struct sockaddr_in *addr = (struct sockaddr_in *)&ifreq_Buf.ifr_addr; - local_ip_ = inet_ntoa(addr->sin_addr); + if (!strncmp(inet_ntoa(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr), + "127.0.0.1", 7)) { + continue; + } + localhost = inet_ntoa(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr); + close(sockfd); + err_info = "Ok"; + return true; + } + close(sockfd); + err_info = "Not found the localHost in local OS"; + return false; } void SdkConfig::ShowClientConfig() { diff --git a/inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-cpp/src/core/api_imp.cc b/inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-cpp/src/core/api_imp.cc index 79706a511e..c4b493b068 100644 --- a/inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-cpp/src/core/api_imp.cc +++ b/inlong-sdk/dataproxy-sdk-twins/dataproxy-sdk-cpp/src/core/api_imp.cc @@ -126,8 +126,7 @@ int32_t ApiImp::CheckData(const std::string inlong_group_id, if (msg.empty() || inlong_group_id.empty() || inlong_stream_id.empty()) { LOG_ERROR("invalid input, inlong_group_id" - << inlong_group_id << " inlong_stream_id" << inlong_stream_id - << "msg" << msg); + << inlong_group_id << " inlong_stream_id" << inlong_stream_id); return SdkCode::kInvalidInput; }