Skip to content

Instantly share code, notes, and snippets.

@kelvin-fly
Created July 2, 2012 09:45
Show Gist options
  • Select an option

  • Save kelvin-fly/3032341 to your computer and use it in GitHub Desktop.

Select an option

Save kelvin-fly/3032341 to your computer and use it in GitHub Desktop.
a small code using sockaddr_in and ifreq to get ip and mac
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
#include<net/if.h>
#include<arpa/inet.h>
#include<linux/sockios.h>
int main(int argc,char **argv)
{
struct sockaddr_in *addr;
struct ifreq ifr;
char *address;
int sockfd;
//printf("%s\n",argv[1]);
char *name = argv[1];
printf("%s\n",name);
if(strlen(name)>=IFNAMSIZ)
printf("device name is error.\n"),exit(0);
strcpy(ifr.ifr_name,name);
sockfd=socket(AF_INET,SOCK_DGRAM,0);
//get inet addr
if(ioctl(sockfd,SIOCGIFADDR,&ifr)<0)
printf("ioctl error!!!\n"),exit(0);
addr = (struct sockaddr_in *)&(ifr.ifr_addr);
address=inet_ntoa(addr->sin_addr);
printf("inet addr:%s\n",address);
//printf("%d\n",ifr.ifr_addr);
//get speed
/* if(ioctl(sockfd,SIOCGIFMETRIC,&ifr)<0)
printf("dont know speed");
printf("%d\n",ifr.ifr_metric);
*/
//get Mask
if(ioctl(sockfd,SIOCGIFADDR,&ifr)<0)
printf("ioctl error.\n"),exit(0);
addr=(struct sockaddr_in *)&ifr.ifr_addr;
address=inet_ntoa(addr->sin_addr);
printf("Mask:%s\n",address);
//get HWaddr
u_int8_t hd[6];
if(ioctl(sockfd,SIOCGIFHWADDR,&ifr)<0)
printf("hwaddr error.\n"),exit(0);
memcpy(hd,ifr.ifr_hwaddr.sa_data,sizeof(hd));
int i=0;
printf("HWaddr:");
for(i;i<6;i++)
{
printf("%02X:",hd[i]);
}
printf("\n");
//get the type of Network card
int index = get_eth_index(argv[1]);
//printf("eth_type:%d\n",index);
if(index==0)
printf("IF_PORT_UNKNOWN\n");
else if(index==1)
printf("eth_type:IF_PORT_10BASET2\n",index);
else if(index==2)
printf("eth_type:IF_PORT_10BASET\n",index);
else if(index==3)
printf("eth_type:IF_PORT_AUI\n",index);
else if(index==4)
printf("eth_type:IF_PORT_100BASET\n",index);
else if(index==5)
printf("eth_type:IF_PORT_100BASETX\n",index);
else if(index==5)
printf("eth_type:IF_PORT_100BASEFX\n",index);
else
printf("eth_type:%d\t please complete the eth_type!!!\n");
exit(0);
}
int get_eth_index(char *ethname)
{
int sock = socket(AF_INET ,SOCK_STREAM , 0);
if(sock <0 )
{
printf("get_mac_index sock error \n");
exit(0);
}
struct ifreq ifstruct;
strcpy(ifstruct.ifr_name ,ethname );
if( ioctl(sock ,SIOCGIFINDEX , &ifstruct) == -1 )
{
printf("get_mac_ioctl error \n");
exit(0);
}
close(sock);
return ifstruct.ifr_ifindex;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment