LinuxQuestions.org

LinuxQuestions.org (/questions/)
-   Linux - Newbie (https://www.linuxquestions.org/questions/linux-newbie-8/)
-   -   How can I get the ip address of my host system (https://www.linuxquestions.org/questions/linux-newbie-8/how-can-i-get-the-ip-address-of-my-host-system-721350/)

dwijesh 04-24-2009 03:20 AM

How can I get the ip address of my host system
 
Hello
I have tried to get the ip address of my host mechine , I have used the following code but here I am geting only MAC address of eth0.

How can I find mac address of eth1 and also init addr of ppp0 when I will connect any data card,

Actually I have to make a C equivalent code of the following shell script


ifconfig eth0 up
eth0=`echo ""`
echo $eth0
for fn in `ifconfig eth0 | grep "Ethernet HWaddr" | sed "s/.*Ethernet HWaddr \(.*\) .*/\1/"`; do
eth0=`echo "$fn$eth0"`;
done
echo $eth0 > eth0.txt

sleep 10
wvdial&
sleep 30
ifconfig ppp0 up
ping valuefirstmessaging.com > /dev/null &
ppp0=`echo ""`
echo $ppp0
for fn in `ifconfig ppp0 | grep "inet addr" | cut -d: -f2 | awk '{print $1}'`; do
ppp0=`echo "$fn$ppp0"`;
done
echo $ppp0 > ppp0.txt



the c code is for getting the eth0 address is

#include <stdio.h>
#include <fcntl.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>

#ifdef Linux
#include <sys/ioctl.h>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <linux/if.h>
#endif

#ifdef HPUX
#include <netio.h>
#endif

#ifdef AIX
#include <sys/ndd_var.h>
#include <sys/kinfo.h>
#endif

long mac_addr_sys ( u_char *addr)
{
/* implementation for Linux */
#ifdef Linux
struct ifreq ifr;
struct ifreq *IFR;
struct ifconf ifc;
char buf[1024];
int s, i;
int ok = 0;

s = socket(AF_INET, SOCK_DGRAM, 0);
if (s==-1) {
return -1;
}

ifc.ifc_len = sizeof(buf);
ifc.ifc_buf = buf;
ioctl(s, SIOCGIFCONF, &ifc);

IFR = ifc.ifc_req;
for (i = ifc.ifc_len / sizeof(struct ifreq); --i >= 0; IFR++) {

strcpy(ifr.ifr_name, IFR->ifr_name);
if (ioctl(s, SIOCGIFFLAGS, &ifr) == 0) {
if (! (ifr.ifr_flags & IFF_LOOPBACK)) {
if (ioctl(s, SIOCGIFHWADDR, &ifr) == 0) {
ok = 1;
break;
}
}
}
}

close(s);
if (ok) {
bcopy( ifr.ifr_hwaddr.sa_data, addr, 6);
}
else {
return -1;
}
return 0;
#endif

/* implementation for HP-UX */
#ifdef HPUX

#define LAN_DEV0 "/dev/lan0"

intfd;
struct fisiocnt_block;
inti;
charnet_buf[sizeof(LAN_DEV0)+1];
char*p;

(void)sprintf(net_buf, "%s", LAN_DEV0);
p = net_buf + strlen(net_buf) - 1;

/*
* Get 802.3 address from card by opening the driver and interrogating it.
*/
for (i = 0; i < 10; i++, (*p)++) {
if ((fd = open (net_buf, O_RDONLY)) != -1) {
iocnt_block.reqtype = LOCAL_ADDRESS;
ioctl (fd, NETSTAT, &iocnt_block);
close (fd);

if (iocnt_block.vtype == 6)
break;
}
}

if (fd == -1 || iocnt_block.vtype != 6) {
return -1;
}

bcopy( &iocnt_block.value.s[0], addr, 6);
return 0;

#endif /* HPUX */

/* implementation for AIX */
#ifdef AIX

int size;
struct kinfo_ndd *nddp;

size = getkerninfo(KINFO_NDD, 0, 0, 0);
if (size <= 0) {
return -1;
}
nddp = (struct kinfo_ndd *)malloc(size);

if (!nddp) {
return -1;
}
if (getkerninfo(KINFO_NDD, nddp, &size, 0) < 0) {
free(nddp);
return -1;
}
bcopy(nddp->ndd_addr, addr, 6);
free(nddp);
return 0;
#endif

/* Not implemented platforms */
return -1;
}

/***********************************************************************/
/*
* Main (only for testing)
*/
#ifdef MAIN
int main( int argc, char **argv)
{
long stat;
int i;
u_char addr[6];
FILE *fp;
fp = fopen("eth0.txt","w");
stat = mac_addr_sys( addr);
if (0 == stat) {
//printf( "MAC address = ");
for (i=0; i<6; ++i) {
fprintf(fp,"%2.2x", addr[i]);
}
printf( "\n");
}
else {
fprintf( stderr, "can't get MAC address\n");
exit( 1);
}
return 0;
}
#endif
/****************************************************************************************
E.g you want to use on Linux, save it as file.c simply compile like this:

gcc -O2 -DMAIN -DLinux file.c -o file

And run it

./file
MAC address = 0008c7e9e386

Compare with /sbin/ifconfig result:

/sbin/ifconfig eth0
eth0 Link encap:Ethernet HWaddr 00:08:C7:E9:E3:86
inet addr:***.***.***.*** Bcast:***.***.***.*** Mask:255.255.255.0
inet6 addr: ********************* Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:265555947 errors:0 dropped:0 overruns:0 frame:0
TX packets:50507373 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:4090310752 (3.8 GiB) TX bytes:1085018636 (1.0 GiB)

*********************************************************************************************/
please respond me.
Thanks in advance
Dwijesh.

janhe 04-25-2009 03:50 AM

please put fragments of code inside code tags (code and /code between [ and ] )

you can read up with
Code:

man grep
man ifconfig
man sed
man cut

also, look at the output from the following command in the terminal:
Code:

ifconfig
That should get you going

onebuck 04-25-2009 07:42 AM

Hi,

I agree that using the vbcode tag '#' for code will make your post cleaner.

You should also 'man ethtool' along with janhe's suggestions.

dwijesh 04-27-2009 04:53 AM

Quote:

Originally Posted by janhe (Post 3520317)
please put fragments of code inside code tags (code and /code between [ and ] )

you can read up with
Code:

man grep
man ifconfig
man sed
man cut

also, look at the output from the following command in the terminal:
Code:

ifconfig
That should get you going


Thanks for your kind replay ,please suggest me how can I ping a URL
like ping valuefirstmessaging.com through c code I have tried to use
cURLpp which is a c++ application . I want c code to implement actually wgen I am calling the .cpp file where all the entire code is writen in like c and compiled with g++ I get a error at realloc() . Is there any function in c++ that can be replaced realloc().

Thanks & Regards
Dwijesh


All times are GMT -5. The time now is 12:04 PM.