linux下获取本地IP信息(没看代码)

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


#include <unistd.h>
//#include <fcntl.h>


#include <sys/ioctl.h>


//#include <netdb.h>
#include <netinet/in.h>
#include <netinet/if_ether.h>
#include <net/if.h>
#include <arpa/inet.h>


//取得本地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、付费专栏及课程。

余额充值