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 <[email protected]>
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;
}