免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3160 | 回复: 3
打印 上一主题 下一主题

[C] 每隔几秒获取本机ip的c程序,但是当使用ifconfig修改主机ip后我的程序就自动退出了 [复制链接]

论坛徽章:
1
申猴
日期:2013-09-03 17:48:13
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2013-12-19 22:16 |只看该作者 |倒序浏览
本帖最后由 wangjc_strive 于 2013-12-20 12:22 编辑

写一个程序每4秒获取一次主机ip地址。
我用两个方法实现。一个是使用ioctl函数获取,另一个是用popen函数调用ifconfig命令获取
我的两个程序都能正常运行,我出现的问题是:
首先,我运行我的程序,能够正常获取ip
然后,我使用ifconfig修改主机IP第一次,此时正常,获取到的ip是修改后的ip。但当我再修改一次ip,这时候获取ip的程序就自动退出了

下面是我的代码,serial_send()函数是通过串口发送出去,没有问题。可以只看main()里面的。
请问,这个问题该怎么解决啊。
  1. //这个是使用ioctl函数获取ip的程序
  2. #include <stdio.h>
  3. #include <string.h>
  4. #include <stdlib.h>
  5. #include <errno.h>
  6. #include <unistd.h>
  7. #include <sys/socket.h>
  8. #include <sys/ioctl.h>
  9. #include <net/if.h>//ifconf ifreq
  10. #include <arpa/inet.h>//inet_aton
  11. #include <netinet/in.h>//sockaddr_in
  12. #include <sys/types.h>
  13. #include <sys/stat.h>
  14. #include <termios.h>
  15. #include <errno.h>
  16. #include <fcntl.h>

  17. int serial_send(char *addr){
  18.         int devfd, writ_len, str_len;
  19.         struct termios opt;

  20.         devfd = open( "/dev/ttyS1", O_RDWR|O_NOCTTY|O_NDELAY);
  21.         if(devfd < 0)
  22.         {
  23.                 perror("open error!\n");
  24.                 return (-1);
  25.         }

  26.         tcgetattr(devfd, &opt);
  27.         opt.c_cflag |= CLOCAL | CREAD;
  28.         opt.c_cflag &= ~PARENB;
  29.         opt.c_cflag &= CSTOPB;
  30.         opt.c_cflag &= ~CSIZE;
  31.         opt.c_cflag |= CS8;
  32.         opt.c_cc[VTIME] = 0;
  33.         opt.c_cc[VMIN] = 0;
  34.         opt.c_lflag &= ~(ICANON|ECHO|ECHOE|ISIG);
  35.         cfsetospeed(&opt, B115200);
  36.         tcsetattr(devfd, TCSANOW, &opt);

  37.         str_len= strlen(addr);
  38.         writ_len = write(devfd, addr, str_len);
  39.         if(writ_len == str_len)
  40.                 printf("write success!\n");
  41.         else if(writ_len == 0)
  42.                 printf("write nothing!\n");
  43.         else
  44.     {
  45.                 printf("write failed!\n");
  46.         perror("write error");
  47.     }
  48.         close(devfd);
  49.         return 0;
  50. }


  51. int main(){
  52.         int sockfd,i, ip_arr_len;
  53.         char *ip;
  54.         char ip_arr[17]={};
  55.     struct sockaddr_in *addr;
  56.         struct ifreq ifr;
  57.     while(1)
  58.     {
  59.         if((sockfd = socket(AF_INET, SOCK_DGRAM,0)) <0)
  60.         {
  61.             printf("socket error\n");
  62.             exit(1);
  63.         }

  64.         memset(&ifr, 0, sizeof(ifr));
  65.         strncpy(ifr.ifr_name, "eth0", sizeof("eth0"));

  66.         //get ip
  67.         if( (ioctl(sockfd, SIOCGIFADDR, &ifr)) == -1)
  68.         {
  69.             perror("ioctl error");
  70.             exit(1);
  71.         }
  72.         addr = (struct sockaddr_in *)&ifr.ifr_addr;
  73.         ip = inet_ntoa(addr->sin_addr);
  74.         //printf("%s's ip   is:  %s\n", ifr.ifr_name, ip);
  75.         for(i=0; (*ip)!='\0'; ip++)
  76.         {
  77.           ip_arr[i]=*ip;
  78.           i++;
  79.         }
  80.         ip_arr[i]='@';
  81.                 ip_arr[i+1]='\0';
  82.         //printf("ip_arr is %s\n", ip_arr);
  83.         //ip_arr_len = strlen(ip_arr);
  84.         //strncat(ip_ahead, ip_arr, ip_arr_len);
  85.         printf("ip_arr is %s\n", ip_arr);

  86.         serial_send(ip_arr);
  87.         close(sockfd);

  88.         memset(ip_arr, '\0', 17);

  89.         sleep(4);
  90.     }
  91.     return 0;
  92. }
复制代码
这个是用popen调用ifconfig的程序
  1. #include <stdio.h>
  2. #include <string.h>
  3. #include <stdlib.h>
  4. #include <errno.h>
  5. #include <unistd.h>
  6. #include <sys/socket.h>
  7. #include <sys/ioctl.h>
  8. #include <net/if.h>//ifconf ifreq
  9. #include <arpa/inet.h>//inet_aton
  10. #include <netinet/in.h>//sockaddr_in
  11. #include <sys/types.h>
  12. #include <sys/stat.h>
  13. #include <termios.h>
  14. #include <errno.h>
  15. #include <fcntl.h>

  16. int serial_send(char *addr){
  17.         int devfd, writ_len, str_len;
  18.         struct termios opt;

  19.         devfd = open( "/dev/ttyUSB0", O_RDWR|O_NOCTTY|O_NDELAY);
  20.         if(devfd < 0)
  21.         {
  22.                 perror("open error!\n");
  23.                 return (-1);
  24.         }

  25.         tcgetattr(devfd, &opt);
  26.         opt.c_cflag |= CLOCAL | CREAD;
  27.         opt.c_cflag &= ~PARENB;
  28.         opt.c_cflag &= CSTOPB;
  29.         opt.c_cflag &= ~CSIZE;
  30.         opt.c_cflag |= CS8;
  31.         opt.c_cc[VTIME] = 0;
  32.         opt.c_cc[VMIN] = 0;
  33.         opt.c_lflag &= ~(ICANON|ECHO|ECHOE|ISIG);
  34.         cfsetospeed(&opt, B115200);
  35.         tcsetattr(devfd, TCSANOW, &opt);

  36.         str_len= strlen(addr);
  37.         writ_len = write(devfd, addr, str_len);
  38.         if(writ_len == str_len)
  39.                 printf("write success!\n");
  40.         else if(writ_len == 0)
  41.                 printf("write nothing!\n");
  42.         else
  43.     {
  44.                 printf("write failed!\n");
  45.         perror("write error");
  46.     }
  47.         close(devfd);
  48.         return 0;
  49. }


  50. int main()
  51. {
  52.     char ip_arr[16]={};
  53.     FILE *fp;
  54.     while(1)
  55.     {
  56.     //灏嗗懡浠ょ殑杈撳嚭閫氳繃绠¢亾璇诲彇鍒癋ILE *fp
  57.         if(NULL==(fp=popen("ifconfig eth0|sed -n '2p'|awk '{print $2}'|sed 's/addr://g'", "r")))
  58.         {
  59.             perror("popen:");
  60.             return 1;
  61.         }
  62.         else
  63.         {
  64.             fread(ip_arr, sizeof(char), 16, fp);
  65.             //printf("ip_arr's len is %d\n", strlen(ip_arr));
  66.             printf(ip_arr);
  67.         }
  68.         pclose(fp);
  69.         serial_send(ip_arr);
  70.         memset(ip_arr, '\0', 16);

  71.         sleep(4);
  72.     }
  73.     return 0;
  74. }
复制代码

论坛徽章:
1
申猴
日期:2013-09-03 17:48:13
2 [报告]
发表于 2013-12-19 22:17 |只看该作者
程序有点长,只看main()就行

论坛徽章:
2
2015年亚洲杯之乌兹别克斯坦
日期:2015-04-15 15:43:482015亚冠之迪拜阿赫利
日期:2015-06-30 20:36:46
3 [报告]
发表于 2013-12-20 11:04 |只看该作者
把你while(1)中的exit(1)和return 1换成

sleep(4);
continue;

试试?

注意有个地方要close(sockfd)。

论坛徽章:
7
摩羯座
日期:2013-12-05 10:42:57辰龙
日期:2013-12-27 13:40:49亥猪
日期:2014-01-15 09:10:37天秤座
日期:2014-01-20 11:22:20辰龙
日期:2014-01-26 17:02:25午马
日期:2014-01-27 14:22:34水瓶座
日期:2014-02-19 09:36:40
4 [报告]
发表于 2013-12-20 13:33 |只看该作者
用hostname -i 取ip多好呀。如果想监听所有的网卡就用0.0.0.0
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP