最近在ESP8266上面需要移植一些库,中间遇到需要获取 broadcast ip,原代码如下:

 

    int fd = -1;
    struct ifreq ifr;
    char ip_buf[IP_LEN];

    (void)ip_len;

    /**create fd */
    fd = socket(AF_INET, SOCK_DGRAM, 0);

    if (fd < 0)
    {
        printf("get broadcast ip error\n\r");
        return -1;
    }

    /**get broadcast addr */
    bzero(&ifr, sizeof(ifr));
    strcpy(ifr.ifr_name, "eth0"); /**notice: change to the right one*/

    if (ioctl(fd, SIOCGIFBRDADDR, &ifr) < 0)
    {
        printf("ioctl SIOCGIFBRDADDR error\n\r");
        close(fd);
        return -1;
    }

    memset(ip_buf, 0, IP_LEN);
    sprintf(ip_buf, "%s", inet_ntoa(((struct sockaddr_in*)&ifr.ifr_addr)->sin_addr));
    strncpy(ip, ip_buf, strlen(ip_buf));
    close(fd);

    printf("local broadcast:%s\n\r", ip_buf);

 

 

 

 

参考如下:

https://blog.csdn.net/q_l_s/article/details/52716730

#include<stdlib.h>  
#include<stdio.h>  
#include<unistd.h>  
#include<net/if.h>  
#include<net/if_arp.h>  
#include<arpa/inet.h>  
#include<sys/ioctl.h>  
#include<errno.h>  
   
#define ETH_NAME  "eth0"  
   
static void get_local_ip(int sock_fd);  
static void get_netmask_addr(int sock_fd);  
static void get_mac_addr(int sock_fd);  
static void get_broad_addr(int sock_fd);  
struct sockaddr_in  sin;  
struct sockaddr_in  netmask;  
struct sockaddr_in  broad;  
struct ifreq ifr;  
unsigned char arp[6];  
int main()  
{  
  int sockfd;  
  //create socket  
  sockfd = socket(AF_INET,SOCK_DGRAM,0);  
  if(sockfd == -1)  
  {  
    perror("socket");  
    return -1;  
  }  
  get_local_ip(sockfd);  
  get_mac_addr(sockfd);  
  get_netmask_addr(sockfd);  
  get_broad_addr(sockfd); 

  
close(fd);//我加的
  return 0;  
}  
static void get_local_ip(int sock_fd) {   strncpy(ifr.ifr_name,ETH_NAME,IFNAMSIZ);   ifr.ifr_name[IFNAMSIZ - 1] = 0;   if(ioctl(sock_fd,SIOCGIFADDR,&ifr) == 0)   {     memcpy(&sin,&ifr.ifr_addr,sizeof(sin));     fprintf(stdout,"eth0: %s\n",inet_ntoa(sin.sin_addr));   } } static void get_mac_addr(int sock_fd) {   if(ioctl(sock_fd,SIOCGIFHWADDR,&ifr)==0)   {     memcpy(arp,ifr.ifr_hwaddr.sa_data,6);     printf("adapter hardware address %x:%x:%x:%x:%x:%x\n",arp[0],arp[1],arp[2],arp[3],arp[4],arp[5]);   } } static void get_netmask_addr(int sock_fd) {   if(ioctl(sock_fd,SIOCGIFNETMASK,&ifr)==0)   {     memcpy(&netmask,&ifr.ifr_netmask,sizeof(netmask));     printf("netmask: %s\n",inet_ntoa(netmask.sin_addr));   }  } static void get_broad_addr(int sock_fd) {   if(ioctl(sock_fd,SIOCGIFBRDADDR,&ifr)==0)   {     memcpy(&broad,&ifr.ifr_broadaddr,sizeof(broad));     printf("broad: %s\n",inet_ntoa(broad.sin_addr));   } }

 

  1. #include<stdlib.h>  
  2. #include<stdio.h>  
  3. #include<unistd.h>  
  4. #include<net/if.h>  
  5. #include<net/if_arp.h>  
  6. #include<arpa/inet.h>  
  7. #include<sys/ioctl.h>  
  8. #include<errno.h>  
  9.    
  10. #define ETH_NAME  “eth0”  
  11.    
  12. static void get_local_ip(int sock_fd);  
  13. static void get_netmask_addr(int sock_fd);  
  14. static void get_mac_addr(int sock_fd);  
  15. static void get_broad_addr(int sock_fd);  
  16. struct sockaddr_in  sin;  
  17. struct sockaddr_in  netmask;  
  18. struct sockaddr_in  broad;  
  19. struct ifreq ifr;  
  20. unsigned char arp[6];  
  21. int main()  
  22. {  
  23. int sockfd;  
  24. //create socket  
  25. sockfd = socket(AF_INET,SOCK_DGRAM,0);  
  26. if(sockfd == -1)  
  27. {  
  28. perror(“socket”);  
  29. return -1;  
  30. }  
  31. get_local_ip(sockfd);  
  32. get_mac_addr(sockfd);  
  33. get_netmask_addr(sockfd);  
  34. get_broad_addr(sockfd);  
  35. return 0;  
  36. }  
  37. static void get_local_ip(int sock_fd)  
  38. {  
  39. strncpy(ifr.ifr_name,ETH_NAME,IFNAMSIZ);  
  40. ifr.ifr_name[IFNAMSIZ – 1] = 0;  
  41. if(ioctl(sock_fd,SIOCGIFADDR,&ifr) == 0)  
  42. {  
  43. memcpy(&sin,&ifr.ifr_addr,sizeof(sin));  
  44. fprintf(stdout,“eth0: %s\n”,inet_ntoa(sin.sin_addr));  
  45. }  
  46. }  
  47. static void get_mac_addr(int sock_fd)  
  48. {  
  49. if(ioctl(sock_fd,SIOCGIFHWADDR,&ifr)==0)  
  50. {  
  51. memcpy(arp,ifr.ifr_hwaddr.sa_data,6);  
  52. printf(“adapter hardware address %x:%x:%x:%x:%x:%x\n”,arp[0],arp[1],arp[2],arp[3],arp[4],arp[5]);  
  53. }  
  54. }  
  55. static void get_netmask_addr(int sock_fd)  
  56. {  
  57. if(ioctl(sock_fd,SIOCGIFNETMASK,&ifr)==0)  
  58. {  
  59. memcpy(&netmask,&ifr.ifr_netmask,sizeof(netmask));  
  60. printf(“netmask: %s\n”,inet_ntoa(netmask.sin_addr));  
  61. }  
  62. }  
  63. static void get_broad_addr(int sock_fd)  
  64. {  
  65. if(ioctl(sock_fd,SIOCGIFBRDADDR,&ifr)==0)  
  66. {  
  67. memcpy(&broad,&ifr.ifr_broadaddr,sizeof(broad));  
  68. printf(“broad: %s\n”,inet_ntoa(broad.sin_addr));  
  69. }  
  70. }  

版权声明:本文为XZHDJH原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://www.cnblogs.com/XZHDJH/articles/12619572.html