Chinaunix首页 | 论坛 | 博客
  • 博客访问: 373922
  • 博文数量: 48
  • 博客积分: 1032
  • 博客等级: 上士
  • 技术积分: 1256
  • 用 户 组: 普通用户
  • 注册时间: 2012-05-19 13:24
文章分类

全部博文(48)

文章存档

2014年(3)

2013年(23)

2012年(22)

分类: LINUX

2012-10-25 15:17:34

在网络通信中经常会获取ip、mac地址等信息,这里总结一下使用方法:
在抓起ip、mac中经常用到几个结构体
struct sockaddr {
    sa_family_t sa_family;//address family
    char        sa_data[14];//variable-length address;
}
中的
struct sockaddr_in{
    sa_family_t sin_family;//address family
    in_port_t sin_port;//port number
    struct in_addr sin_addr;//ipv4 address
}

struct in_addr{
    in_addr_t    addr;//ipv4 address;
}

以及在中定义的ifreq
struct ifreq
  {
# define IFHWADDRLEN 6
# define IFNAMSIZ IF_NAMESIZE
    union
      {
char ifrn_name[IFNAMSIZ]; /* Interface name, e.g. "en0".  */
      } ifr_ifrn;

    union
      {
struct sockaddr ifru_addr;
struct sockaddr ifru_dstaddr;
struct sockaddr ifru_broadaddr;
struct sockaddr ifru_netmask;
struct sockaddr ifru_hwaddr;
short int ifru_flags;
int ifru_ivalue;
int ifru_mtu;
struct ifmap ifru_map;
char ifru_slave[IFNAMSIZ]; /* Just fits the size */
char ifru_newname[IFNAMSIZ];
__caddr_t ifru_data;
      } ifr_ifru;
  };
# define ifr_name ifr_ifrn.ifrn_name /* interface name */
# define ifr_hwaddr ifr_ifru.ifru_hwaddr /* MAC address */
# define ifr_addr ifr_ifru.ifru_addr /* address */
# define ifr_dstaddr ifr_ifru.ifru_dstaddr /* other end of p-p lnk */
# define ifr_broadaddr ifr_ifru.ifru_broadaddr /* broadcast address */
# define ifr_netmask ifr_ifru.ifru_netmask /* interface net mask */
# define ifr_flags ifr_ifru.ifru_flags /* flags */
# define ifr_metric ifr_ifru.ifru_ivalue /* metric */
# define ifr_mtu ifr_ifru.ifru_mtu /* mtu */
# define ifr_map ifr_ifru.ifru_map /* device map */
# define ifr_slave ifr_ifru.ifru_slave /* slave device */
# define ifr_data ifr_ifru.ifru_data /* for use by interface */
# define ifr_ifindex ifr_ifru.ifru_ivalue    /* interface index      */
# define ifr_bandwidth ifr_ifru.ifru_ivalue /* link bandwidth */
# define ifr_qlen ifr_ifru.ifru_ivalue /* queue length */
# define ifr_newname ifr_ifru.ifru_newname /* New name */
# define _IOT_ifreq _IOT(_IOTS(char),IFNAMSIZ,_IOTS(char),16,0,0)
# define _IOT_ifreq_short _IOT(_IOTS(char),IFNAMSIZ,_IOTS(short),1,0,0)
# define _IOT_ifreq_int _IOT(_IOTS(char),IFNAMSIZ,_IOTS(int),1,0,0)

常用的ioctl命令:
类别 Request 说明 数据类型

SIOCATMARK 是否位于带外标记 int
SIOCSPGRP 设置套接口的进程ID或进程组ID int
SIOCGPGRP 获取套接口的进程ID或进程组ID int

FIONBIN 设置/ 清除非阻塞I/O标志 int
  FIOASYNC 设置/ 清除信号驱动异步I/O标志 int
FIONREAD 获取接收缓存区中的字节数 int
  FIOSETOWN 设置文件的进程ID或进程组ID int
  FIOGETOWN 获取文件的进程ID或进程组ID int
 
SIOCGIFCONF 获取所有接口的清单 struct ifconf
SIOCSIFADDR 设置接口地址 struct ifreq
SIOCGIFADDR 获取接口地址 struct ifreq
SIOCSIFFLAGS 设置接口标志 struct ifreq
SIOCGIFFLAGS 获取接口标志 struct ifreq
SIOCSIFDSTADDR 设置点到点地址 struct ifreq
口  SIOCGIFDSTADDR 获取点到点地址 struct ifreq
SIOCGIFBRDADDR 获取广播地址 struct ifreq
SIOCSIFBRDADDR 设置广播地址 struct ifreq
SIOCGIFNETMASK 获取子网掩码 struct ifreq
SIOCSIFNETMASK 设置子网掩码 struct ifreq
SIOCGIFMETRIC 获取接口的测度 struct ifreq
SIOCSIFMETRIC 设置接口的测度 struct ifreq
SIOCGIFMTU 获取接口MTU struct ifreq
SIOCxxx (还有很多取决于系统的实现) struct ifreq
 
ARP SIOCSARP 创建/修改ARP表项 struct arpreq
SIOCGARP 获取ARP表项 struct arpreq
SIOCDARP 删除ARP表项 struct arpreq

SIOCADDRT 增加路径 struct rtentry
SIOCDELRT 删除路径 struct rtentry

推荐文章:

获取IP地址:

点击(此处)折叠或打开

  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. #include

  9. char *GetIp( char *ipaddr)
  10. {
  11.         struct sockaddr_in addr;
  12.         struct hostent *host;
  13.         struct ifreq req;
  14.         int sock;
  15. char *temp_ip = NULL;
  16.         sock = socket(AF_INET, SOCK_DGRAM, 0);
  17.         strncpy(req.ifr_name, "eth0", IFNAMSIZ);
  18.         if ( ioctl(sock, SIOCGIFADDR, &req) < 0 ) 
  19.         {
  20.             fprintf(stderr,"ioctl error: %s\n", strerror (errno));
  21.             return NULL;
  22.           }
  23.        temp_ip = (char *)inet_ntoa(*(struct in_addr *) &((struct sockaddr_in *) &req.ifr_addr)->sin_addr);
  24.        strcpy(ipaddr,temp_ip);
  25. close(sock); 
  26.        return ipaddr;
  27. }
  28. int main(void)
  29. {
  30.         char *current_ip_address;
  31.         current_ip_address = (char *)malloc(20*sizeof(char));
  32. memset(current_ip_address,'\0',sizeof(current_ip_address));
  33.         current_ip_address = GetIp(current_ip_address); 
  34.         printf("current ip address: %s\n", current_ip_address);
  35. free(current_ip_address);
  36.         return 0;
  37. }
获取MAC地址:

点击(此处)折叠或打开

  1. #include
  2. #include
  3. #include
  4. #include
  5. #include
  6. #include
  7. #include
  8. #include

  9. char *GetLocalMac(char *mac_addr)  
  10. {  
  11.     int sock_mac;  
  12.       
  13.     struct ifreq ifr_mac;  
  14.       
  15.     sock_mac = socket( AF_INET, SOCK_STREAM, 0 );  
  16.     if( sock_mac == -1)  
  17.     {  
  18.         perror("create socket failed...mac\n");  
  19.         return "-1";  
  20.     }  
  21.       
  22.     memset(&ifr_mac,0,sizeof(ifr_mac));     
  23.     strncpy(ifr_mac.ifr_name, "eth0", sizeof(ifr_mac.ifr_name)-1);     
  24.   
  25.     if( (ioctl( sock_mac, SIOCGIFHWADDR, &ifr_mac)) < 0)  
  26.     {  
  27.         printf("mac ioctl error\n");  
  28.         return "-1";  
  29.     }  
  30.       
  31.     sprintf(mac_addr,"%02x:%02x:%02x:%02x:%02x:%02x",  
  32.             (unsigned char)ifr_mac.ifr_hwaddr.sa_data[0],  
  33.             (unsigned char)ifr_mac.ifr_hwaddr.sa_data[1],  
  34.             (unsigned char)ifr_mac.ifr_hwaddr.sa_data[2],  
  35.             (unsigned char)ifr_mac.ifr_hwaddr.sa_data[3],  
  36.             (unsigned char)ifr_mac.ifr_hwaddr.sa_data[4],  
  37.             (unsigned char)ifr_mac.ifr_hwaddr.sa_data[5]);        
  38.     
  39.     close(sock_mac);  
  40.     return  mac_addr;  
  41. }  
  42. int main()
  43. {
  44. char *mac;
  45. mac = (char *)malloc(20*sizeof(char));
  46. memset(mac,'\0',sizeof(mac));
  47. mac = GetLocalMac(mac);
  48. printf("mac:%s\n",mac);
  49. free(mac);
  50.   return 0;
  51. }

阅读(4167) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~