linux 读取 gateway ip socket,linux下获取本地IP信息

#include

#include

#include

#include

//#include

#include

//#include

#include

#include

#include

#include

//取得本地ip

void GetLocalIp(unsigned long *pOutIpAddress)

{

int fd;

struct ifreq ifr;

struct sockaddr_in* sin;

fd = socket(PF_INET, SOCK_DGRAM, 0);

memset(&ifr, 0x00, sizeof(ifr));

strcpy(ifr.ifr_name, "eth0");

ioctl(fd, SIOCGIFADDR, &ifr);

close(fd);

sin = (struct sockaddr_in* )&ifr.ifr_addr;

*pOutIpAddress = sin->sin_addr.s_addr;

}

unsigned long GetNetworkMask()

{

int fd;

struct ifreq ifr;

struct sockaddr_in* sin;

fd = socket(PF_INET, SOCK_DGRAM, 0);

memset(&ifr, 0x00, sizeof(ifr));

strcpy(ifr.ifr_name, "eth0");

ioctl(fd, SIOCGIFNETMASK, &ifr);

close(fd);

sin = (struct sockaddr_in* )&ifr.ifr_netmask;

return sin->sin_addr.s_addr;

}

unsigned long GetNetworkGateway()

{

FILE *stream;

char buf[100];

memset( buf, '/0', sizeof(buf) );

stream = popen( "cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep GATEWAY", "r" );

fread( buf, sizeof(char), sizeof(buf), stream); //将刚刚FILE* stream的数据流读取到buf中

memmove(buf, buf + 8, 92);

pclose( stream );

return inet_addr(buf);

}

int GetDHCPType()

{

FILE *stream;

char buf[20];

memset( buf, '/0', sizeof(buf) );

stream = popen( "cat /etc/sysconfig/network-scripts/ifcfg-eth0 | grep BOOTPROTO", "r" );

fread( buf, sizeof(char), sizeof(buf), stream); //将刚刚FILE* stream的数据流读取到buf中

pclose( stream );

memmove(buf, buf + 10, 10);

return strncasecmp(buf, "dhcp", 4);

}

/********************************************************************************/

/** 获取本机MAC地址和IP */

/********************************************************************************/

void Getipaddr(struct in_addr *hostIP,unsigned char * HostMac)

{

int sockfd, size = 1;

struct ifreq * ifr;

struct ifconf ifc;

struct sockaddr_in sa;

unsigned char *u;

#define IFRSIZE ( ( int )( size * sizeof( struct ifreq ) ) )

if ( 0 > ( sockfd = socket( AF_INET, SOCK_DGRAM, IPPROTO_IP ) ) )

{

fprintf( stderr, "Cannot open socket./n" );

return;

}

ifc.ifc_req = NULL;

do

{

++size;

/* realloc buffer size until no overflow occurs */

if ( NULL == ( ifc.ifc_req = (ifreq *)realloc(ifc.ifc_req, IFRSIZE )))

{

fprintf( stderr, "Out of memory./n" );

return;

}

ifc.ifc_len = IFRSIZE;

if ( ioctl( sockfd, SIOCGIFCONF, &ifc ) )

{

perror( "ioctl SIOCFIFCONF" );

return ;

}

} while ( IFRSIZE <= ifc.ifc_len );

ifr = ifc.ifc_req;

for ( ; ( char * )ifr < ( char * )ifc.ifc_req + ifc.ifc_len; ++ifr )

{

if ( ifr->ifr_addr.sa_data == ( ifr + 1 )->ifr_addr.sa_data )

{

continue; /* duplicate, skip it */

}

if ( ioctl( sockfd, SIOCGIFFLAGS, ifr ) )

{

continue; /* failed to get flags, skip it */

}

if(strcmp(ifr->ifr_name,"eth0") == 0)//,sizeof(ifr.ifr_name)-1打印eth0的IP

{

*hostIP = ((struct sockaddr_in*)(&(ifr->ifr_addr)))->sin_addr;

}

if ( 0 == ioctl( sockfd, SIOCGIFHWADDR, ifr ) )

{

switch ( ifr->ifr_hwaddr.sa_family )

{

case ARPHRD_NETROM:

case ARPHRD_ETHER:

case ARPHRD_PPP:

case ARPHRD_EETHER:

case ARPHRD_IEEE802:

break;

default:

printf( "/n" );

continue;

}

u = ( unsigned char * )&ifr->ifr_addr.sa_data; //取得MAC地址

if ( u[0] + u[1] + u[2] + u[3] + u[4] + u[5] )

{

printf( "HW Address: %2.2x:%2.2x:%2.2x:%2.2x:%2.2x:%2.2x/n",

u[0], u[1], u[2], u[3], u[4], u[5] );

}

if(strcmp(ifr->ifr_name, "eth0") == 0)//,sizeof(ifr.ifr_name)-1打印eth0的IP

memcpy(HostMac,u,6);

}

} /* end of for */

close( sockfd );

return;

}

int Openintf(char *nt_card)

{

int fd;

struct ifreq ifr; /*接口请求结构,用来调用在I/O输入输出时使用*/

int sign;

fd = socket(AF_INET, SOCK_PACKET, htons(/*0x0806*/0x0003)); //wrtie也出错

/*0x0800是IP,0x0806是ARP,0x8035是RARP,0x0003是任何都可以*/

if(fd < 0)

{

perror("cant get SOCK_PACKET socket");

return(-1);

}

strcpy(ifr.ifr_name, nt_card);

sign = ioctl(fd, SIOCGIFFLAGS, &ifr); /*读取标志位*/

if(sign < 0)

{

close(fd);

perror("cant get flags");

return(-1);

}

ifr.ifr_flags |= IFF_PROMISC; /*设置标志位为混杂模式,sniffer是在这种模式下工作的*/

ifr.ifr_flags |= ~IFF_NOARP; //

sign = ioctl(fd, SIOCSIFFLAGS, &ifr); /*写入标志位*/

if(sign < 0)

{

perror("cant set promiscuous mode");

}

return fd;

}

int main(int argc, char *argv[])

{

//get ipaddr

unsigned long ipAddr;

GetLocalIp(&ipAddr);

char strip[5];

memset(strip,0x0,5);

memcpy(strip,(void*)&ipAddr,4);

for(int i = 0 ; i < 4 ; i++ )

{

printf(" %3d ",0xff&strip[i]);

}

printf("/r/n");

//get networkmask

ipAddr = GetNetworkMask();

memset(strip,0x0,5);

memcpy(strip,(void*)&ipAddr,4);

for(int i = 0 ; i < 4 ; i++ )

{

printf(" %3d ",0xff&strip[i]);

}

printf("/r/n");

//get network Gateway

ipAddr = GetNetworkGateway();

memset(strip,0x0,5);

memcpy(strip,(void*)&ipAddr,4);

for(int i = 0 ; i < 4 ; i++ )

{

printf(" %3d ",0xff&strip[i]);

}

printf("/r/n");

//get dhcp

int idhcp = GetDHCPType();

printf("dhcp = %d /r/n",idhcp);

//get ip and mac

struct in_addr hostIP;

unsigned char HostMac[8];

Getipaddr(&hostIP,HostMac);

for(int i = 0 ; i < 6 ; i++)

{

printf(" %2x ",0xff&HostMac[i]);

}

printf("/r/n");

ipAddr = hostIP.s_addr;

memset(strip,0x0,5);

memcpy(strip,(void*)&ipAddr,4);

for(int i = 0 ; i < 4 ; i++ )

{

printf(" %3d ",0xff&strip[i]);

}

printf("/r/n");

//ctrl eth0

Openintf("eth0");

return 1;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值