Brad Parker
11 years ago
7 changed files with 181 additions and 72 deletions
@ -0,0 +1,19 @@ |
|||
#ifndef INTERFACE_H |
|||
#define INTERFACE_H |
|||
|
|||
#include <QObject> |
|||
|
|||
class Q_DECL_EXPORT Interface : public QObject { |
|||
Q_OBJECT |
|||
|
|||
public: |
|||
Interface(QString interface); |
|||
static QStringList list(); |
|||
QStringList addresses(); |
|||
bool hasCarrier(); |
|||
|
|||
private: |
|||
QString m_interface; |
|||
}; |
|||
|
|||
#endif // INTERFACE_H
|
@ -1,15 +0,0 @@ |
|||
#ifndef IP_H |
|||
#define IP_H |
|||
|
|||
#include <QObject> |
|||
|
|||
class Q_DECL_EXPORT IP : public QObject { |
|||
Q_OBJECT |
|||
|
|||
public: |
|||
IP(); |
|||
QString macOfIP(const char *ip); |
|||
QStringList addresses(const char *interface); |
|||
}; |
|||
|
|||
#endif // IP
|
@ -0,0 +1,79 @@ |
|||
extern "C" { |
|||
#include <netlink/cli/utils.h> |
|||
#include <netlink/cli/neigh.h> |
|||
#include <netlink/cli/addr.h> |
|||
#include <netlink/cli/link.h> |
|||
#include <pthread.h> |
|||
} |
|||
|
|||
#include "neighbor.h" |
|||
#include <iostream> |
|||
#include <QStringList> |
|||
|
|||
#define BUFLEN 65535 |
|||
#define MACBUFLEN 18 |
|||
|
|||
Neighbor::Neighbor(QString interface) : |
|||
QObject(0), |
|||
m_interface(interface) |
|||
{ |
|||
|
|||
} |
|||
|
|||
QString Neighbor::macOfIP(QString ip) { |
|||
struct nl_sock *sock; |
|||
struct rtnl_neigh *neigh; |
|||
struct nl_cache *neigh_cache; |
|||
struct nl_dump_params params; |
|||
char buf[BUFLEN]; |
|||
char mac[MACBUFLEN]; |
|||
QByteArray ipArray = ip.toLatin1(); |
|||
char *ipAddr = ipArray.data(); |
|||
|
|||
memset(¶ms, 0, sizeof(struct nl_dump_params)); |
|||
|
|||
params.dp_type = NL_DUMP_LINE; |
|||
params.dp_fd = NULL; |
|||
params.dp_buf = buf; |
|||
params.dp_buflen = BUFLEN; |
|||
|
|||
sock = nl_cli_alloc_socket(); |
|||
nl_cli_connect(sock, NETLINK_ROUTE); |
|||
neigh_cache = nl_cli_neigh_alloc_cache(sock); |
|||
neigh = nl_cli_neigh_alloc(); |
|||
|
|||
nl_cli_neigh_parse_dst(neigh, ipAddr); |
|||
|
|||
memset(buf, 0, BUFLEN); |
|||
memset(mac, 0, MACBUFLEN); |
|||
|
|||
nl_cache_dump_filter(neigh_cache, ¶ms, OBJ_CAST(neigh)); |
|||
|
|||
unsigned short count = 0; |
|||
char *rest = NULL; |
|||
char *field = strtok_r(buf, " ", &rest); |
|||
|
|||
while(field != NULL) { |
|||
++count; |
|||
|
|||
if(count == 5) { |
|||
if(strstr(field, ":") != NULL) { |
|||
memcpy(mac, field, MACBUFLEN - 1); |
|||
} |
|||
} |
|||
|
|||
field = strtok_r(NULL, " ", &rest); |
|||
} |
|||
|
|||
nl_object_free(OBJ_CAST(neigh)); |
|||
nl_cache_free(neigh_cache); |
|||
nl_socket_free(sock); |
|||
|
|||
if(mac == NULL || count == 0) { |
|||
return "00:00:00:00:00:00"; |
|||
} |
|||
|
|||
QString macStr = mac; |
|||
|
|||
return macStr; |
|||
} |
@ -0,0 +1,17 @@ |
|||
#ifndef NEIGHBOR_H |
|||
#define NEIGHBOR_H |
|||
|
|||
#include <QObject> |
|||
|
|||
class Q_DECL_EXPORT Neighbor : public QObject { |
|||
Q_OBJECT |
|||
|
|||
public: |
|||
Neighbor(QString interface = QString()); |
|||
QString macOfIP(QString ip); |
|||
|
|||
private: |
|||
QString m_interface; |
|||
}; |
|||
|
|||
#endif // NEIGHBOR_H
|
Loading…
Reference in new issue