erondem wrote: ↑Fri Dec 21, 2018 12:09 pm
Hi,
My raspbery pi is doing regular tasks and send logs to the server. The network which server is running on has DHCP enabled. So sometimes IP of the raspberry can change (I thing IT guys, changes something on the network, and the IP which is assigned to raspberry is changes).
When I need to change someting on code have to search network with a scanner program and connect to the device via SSH. Till now everything is okey.
What I want to do is since raspberry can connect to the server and send some logs to db , can it detect its own IP adress once at every re-connection.And send it to the server? The program I wrote is in C++ so it has to be in C++ language.
There is example code at the bottom of the manual page for getifaddrs.
Code: Select all
GETIFADDRS(3) Linux Programmer's Manual GETIFADDRS(3)
NAME
getifaddrs, freeifaddrs - get interface addresses
SYNOPSIS
#include <sys/types.h>
#include <ifaddrs.h>
int getifaddrs(struct ifaddrs **ifap);
void freeifaddrs(struct ifaddrs *ifa);
DESCRIPTION
The getifaddrs() function creates a linked list of structures describing the
network interfaces of the local system,
This will give you exactly the information you want using the programming language you are already using without using some kludge of running a utility via "system" which you would then have to parse the output from.
Use the correct tools for the job.
For your convenience here is the code from the manual page....
Code: Select all
#define _GNU_SOURCE /* To get defns of NI_MAXSERV and NI_MAXHOST */
#include <arpa/inet.h>
#include <sys/socket.h>
#include <netdb.h>
#include <ifaddrs.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <linux/if_link.h>
int main(int argc, char *argv[])
{
struct ifaddrs *ifaddr, *ifa;
int family, s, n;
char host[NI_MAXHOST];
if (getifaddrs(&ifaddr) == -1) {
perror("getifaddrs");
exit(EXIT_FAILURE);
}
/* Walk through linked list, maintaining head pointer so we
can free list later */
for (ifa = ifaddr, n = 0; ifa != NULL; ifa = ifa->ifa_next, n++) {
if (ifa->ifa_addr == NULL)
continue;
family = ifa->ifa_addr->sa_family;
/* Display interface name and family (including symbolic
form of the latter for the common families) */
printf("%-8s %s (%d)\n",
ifa->ifa_name,
(family == AF_PACKET) ? "AF_PACKET" :
(family == AF_INET) ? "AF_INET" :
(family == AF_INET6) ? "AF_INET6" : "???",
family);
/* For an AF_INET* interface address, display the address */
if (family == AF_INET || family == AF_INET6) {
s = getnameinfo(ifa->ifa_addr,
(family == AF_INET) ? sizeof(struct sockaddr_in) :
sizeof(struct sockaddr_in6),
host, NI_MAXHOST,
NULL, 0, NI_NUMERICHOST);
if (s != 0) {
printf("getnameinfo() failed: %s\n", gai_strerror(s));
exit(EXIT_FAILURE);
}
printf("\t\taddress: <%s>\n", host);
} else if (family == AF_PACKET && ifa->ifa_data != NULL) {
struct rtnl_link_stats *stats = ifa->ifa_data;
printf("\t\ttx_packets = %10u; rx_packets = %10u\n"
"\t\ttx_bytes = %10u; rx_bytes = %10u\n",
stats->tx_packets, stats->rx_packets,
stats->tx_bytes, stats->rx_bytes);
}
}
freeifaddrs(ifaddr);
exit(EXIT_SUCCESS);
}
That should get you on the right path

PeterO