Prechádzať zdrojové kódy

get ipv4 & broadcast addr

xuqiang 4 mesiacov pred
rodič
commit
c0007bb0a3
3 zmenil súbory, kde vykonal 75 pridanie a 1 odobranie
  1. 2 0
      include/utils.h
  2. 15 0
      src/main.cpp
  3. 58 1
      src/utils.cpp

+ 2 - 0
include/utils.h

@@ -12,6 +12,8 @@ public:
     
     static QString timestamp();
     static qint64 currentNanoTimestamp();
+    static bool ipv4(const char *ifname, char **ip_str, char **mask_str);
+    static QString broadcast(const char *ip_str, const char *mask_str);
 
 };
 

+ 15 - 0
src/main.cpp

@@ -4,6 +4,7 @@
 #include "logger.h"
 #include "appcontext.h"
 #include "version.h"
+#include "utils.h"
 
 #define SCREEN_WIDTH    1280
 #define SCREEN_HEIGHT   720
@@ -22,11 +23,25 @@ int main(int argc, char *argv[])
     Logger::setup(Logger::TRACE, "storage/logs/log.txt");
 #endif
 
+    char *ip = NULL;
+    char *mask = NULL;
+    bool result = Utils::ipv4("eth0", &ip, &mask);
+
     LOG_INFO("PROJECT_NAME:         {}", PROJECT_NAME);
     LOG_INFO("PROJECT_VERSION:      {}", PROJECT_VERSION);
     LOG_INFO("PROJECT_GIT_HASH:     {}", PROJECT_GIT_HASH);
     LOG_INFO("PROJECT_GIT_BRANCH:   {}", PROJECT_GIT_BRANCH);
     LOG_INFO("PROJECT_BUILD_TIME:   {}", PROJECT_BUILD_TIME);
+    if(result) {
+        LOG_INFO("LOCAL IPv4:           {}/{}", ip, mask);
+    } else {
+        LOG_ERROR("get local ipv4 error");
+    }
+
+    QString broadcast = Utils::broadcast(ip, mask);
+    LOG_INFO("BROADCAST:            {}", broadcast.toUtf8().data());
+    free(ip);
+    free(mask);
 
     if(argc != 2) {
         LOG_ERROR("miss arg: frequency");

+ 58 - 1
src/utils.cpp

@@ -2,6 +2,9 @@
 #include <QDateTime>
 #include <QElapsedTimer>
 #include <time.h>
+#include <ifaddrs.h>
+#include <arpa/inet.h>
+#include <netinet/in.h>
 
 Utils::Utils(QObject *parent)
     : QObject{parent}
@@ -38,4 +41,58 @@ qint64 Utils::currentNanoTimestamp()
     clock_gettime(CLOCK_REALTIME, &ts);
     qint64 timestamp = ts.tv_sec * 1000000000LL + ts.tv_nsec;
     return timestamp;
-}
+}
+
+bool Utils::ipv4(const char *ifname, char **ip_str, char **mask_str)
+{
+    struct ifaddrs *ifaddr, *ifa;
+    char ip[INET_ADDRSTRLEN] = {0};
+    char mask[INET_ADDRSTRLEN] = {0};
+
+    if (getifaddrs(&ifaddr) == -1) {
+        perror("getifaddrs");
+        return NULL;
+    }
+
+    // char *addr = NULL;
+    // char *mask = NULL;
+    // QString ipv4;
+
+    for (ifa = ifaddr; ifa != NULL; ifa = ifa->ifa_next) {
+        if (!ifa->ifa_addr)
+            continue;
+
+        if (strcmp(ifa->ifa_name, ifname) != 0)
+            continue;
+
+        if (ifa->ifa_addr->sa_family == AF_INET) {
+            struct sockaddr_in *addr = (struct sockaddr_in *)ifa->ifa_addr;
+            struct sockaddr_in *netmask = (struct sockaddr_in *)ifa->ifa_netmask;
+            if (inet_ntop(AF_INET, &addr->sin_addr, ip, sizeof(ip)) &&
+                inet_ntop(AF_INET, &netmask->sin_addr, mask, sizeof(mask))) {
+                *ip_str = strdup(ip);
+                *mask_str = strdup(mask);
+                // ipv4 = QString("%1/%2").arg(ip, mask);
+                return true; // IPv4 一般只有一个
+            }
+        }
+    }
+
+    freeifaddrs(ifaddr);
+    // free(result);
+    return false;
+}
+
+QString Utils::broadcast(const char *ip_str, const char *mask_str)
+{
+    struct in_addr ip, mask, broadcast;
+
+    inet_pton(AF_INET, ip_str, &ip);
+    inet_pton(AF_INET, mask_str, &mask);
+
+    broadcast.s_addr = ip.s_addr | ~mask.s_addr;
+    char broadcast_str[INET_ADDRSTRLEN];
+    inet_ntop(AF_INET, &broadcast, broadcast_str, INET_ADDRSTRLEN);
+
+    return QString("%1").arg(broadcast_str);
+}