获得eth0接口所有信息:

  1. #include <stdio.h>
  2. #include <stdlib.h>
  3. #include <sys/types.h>
  4. #include <sys/stat.h>
  5. #include <unistd.h>
  6. #include <sys/ioctl.h>
  7. #include <sys/socket.h>
  8. #include <netinet/in.h>
  9. #include <arpa/inet.h>
  10. #include <net/if.h>
  11. #include <string.h>
  12. unsigned char g_eth_name[16];
  13. unsigned char g_macaddr[16];
  14. unsigned int g_subnetmask;
  15. unsigned int g_ipaddr;
  16. unsigned int g_broadcast_ipaddr;
  17. //初始化网络,获取当前网络设备信息
  18. void init_net(void)
  19. {
  20. int i ;
  21. int sock;
  22. struct sockaddr_in sin;
  23. struct ifreq ifr;
  24. sock=socket(AF_INET, SOCK_DGRAM, 0);
  25. if(sock==-1)
  26. perror("socket");
  27. strcpy(g_eth_name, "eth0");
  28. strcpy(ifr.ifr_name, g_eth_name);
  29. printf("eth name:\t%s\n", g_eth_name);
  30. //获取并打印网卡地址
  31. if(ioctl(sock, SIOCGIFHWADDR, &ifr) <0 )
  32. perror("ioctl error\n");
  33. memcpy(g_macaddr, ifr.ifr_hwaddr.sa_data, 6);
  34. printf("local mac:\t");
  35. for(i=0;i<5;i++)
  36. printf("%.2x:", g_macaddr[i]);
  37. printf("%.2x\n", g_macaddr[i]);
  38. //获取并打印IP地址
  39. if(ioctl(sock, SIOCGIFADDR, &ifr)<0)
  40. perror("ioctl error\n");
  41. memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
  42. g_ipaddr = sin.sin_addr.s_addr;
  43. printf("local eth0:\t%s\n", inet_ntoa(sin.sin_addr));
  44. //获取并打印广播地址
  45. if(ioctl(sock, SIOCGIFBRDADDR, &ifr)<0)
  46. perror("ioctl error\n");
  47. memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
  48. g_broadcast_ipaddr = sin.sin_addr.s_addr;
  49. printf("broadcast:\t%s\n", inet_ntoa(sin.sin_addr));
  50. //获取并打印子网掩码
  51. if(ioctl(sock,SIOCGIFNETMASK,&ifr)<0)
  52. perror("ioctl error\n");
  53. memcpy(&sin, &ifr.ifr_addr, sizeof(sin));
  54. g_subnetmask = sin.sin_addr.s_addr;
  55. printf("subnetmask:\t%s\n", inet_ntoa(sin.sin_addr));
  56. close(sock);
  57. }
  58. int main()
  59. {
  60. //initialize
  61. init_net();
  62. //do something
  63. //....
  64. return 0;
  65. }

获取所有IP:

  1. #include <string.h>
  2. #include <sys/ioctl.h>
  3. #include <sys/socket.h>
  4. #include <stdlib.h>
  5. #include <stdio.h>
  6. #include <linux/if.h>
  7. #include <arpa/inet.h>
  8. int main()
  9. {
  10. int i=0;
  11. int sockfd;
  12. struct ifconf ifconf;
  13. unsigned char buf[512];
  14. struct ifreq *ifreq;
  15. //初始化ifconf
  16. ifconf.ifc_len = 512;
  17. ifconf.ifc_buf = buf;
  18. if ((sockfd = socket(AF_INET, SOCK_DGRAM, 0)) < 0)
  19. {
  20. perror("socket open failure!\n" );
  21. exit(1);
  22. }
  23. ioctl(sockfd, SIOCGIFCONF, &ifconf); //获取所有接口信息
  24. //接下来一个一个的获取IP地址
  25. ifreq = (struct ifreq*)buf;
  26. for (i=(ifconf.ifc_len/sizeof (struct ifreq)); i>0; i--)
  27. {
  28. if(ifreq->ifr_flags == AF_INET)
  29. {
  30. printf("name = [%s] " , ifreq->ifr_name);
  31. printf("local addr = [%s]",
  32. inet_ntoa(((struct sockaddr_in*)&(ifreq->ifr_addr))->sin_addr));
  33. printf();
  34. ifreq++;
  35. }
  36. }
  37. return 0;
  38. }
获取本机的IP和MAC地址:
  1. /* 得到本机的mac地址和ip地址 */
  2. int GetLocalMac ( const char *device,char *mac,char *ip )
  3. {
  4. int sockfd;
  5. struct ifreq req;
  6. struct sockaddr_in * sin;
  7. if ( ( sockfd = socket ( PF_INET,SOCK_DGRAM,0 ) ) ==-1 )
  8. {
  9. fprintf ( stderr,"Sock Error:%s\n\a",strerror ( errno ) );
  10. return ( -1 );
  11. }
  12. memset ( &req,0,sizeof ( req ) );
  13. strcpy ( req.ifr_name,device );
  14. if ( ioctl ( sockfd,SIOCGIFHWADDR, ( char * ) &req ) ==-1 )
  15. {
  16. fprintf ( stderr,"ioctl SIOCGIFHWADDR:%s\n\a",strerror ( errno ) );
  17. close ( sockfd );
  18. return ( -1 );
  19. }
  20. memcpy ( mac,req.ifr_hwaddr.sa_data,6 );
  21. req.ifr_addr.sa_family = PF_INET;
  22. if ( ioctl ( sockfd,SIOCGIFADDR, ( char * ) &req ) ==-1 )
  23. {
  24. fprintf ( stderr,"ioctl SIOCGIFADDR:%s\n\a",strerror ( errno ) );
  25. close ( sockfd );
  26. return ( -1 );
  27. }
  28. sin = ( struct sockaddr_in * ) &req.ifr_addr;
  29. memcpy ( ip, ( char * ) &sin->sin_addr,4 );
  30. return ( 0 );
  31. }
05-11 10:57
查看更多