- 论坛徽章:
- 1
|
本帖最后由 wangjc_strive 于 2013-12-20 12:22 编辑
写一个程序每4秒获取一次主机ip地址。
我用两个方法实现。一个是使用ioctl函数获取,另一个是用popen函数调用ifconfig命令获取
我的两个程序都能正常运行,我出现的问题是:
首先,我运行我的程序,能够正常获取ip
然后,我使用ifconfig修改主机IP第一次,此时正常,获取到的ip是修改后的ip。但当我再修改一次ip,这时候获取ip的程序就自动退出了
下面是我的代码,serial_send()函数是通过串口发送出去,没有问题。可以只看main()里面的。
请问,这个问题该怎么解决啊。- //这个是使用ioctl函数获取ip的程序
- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <unistd.h>
- #include <sys/socket.h>
- #include <sys/ioctl.h>
- #include <net/if.h>//ifconf ifreq
- #include <arpa/inet.h>//inet_aton
- #include <netinet/in.h>//sockaddr_in
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <termios.h>
- #include <errno.h>
- #include <fcntl.h>
- int serial_send(char *addr){
- int devfd, writ_len, str_len;
- struct termios opt;
- devfd = open( "/dev/ttyS1", O_RDWR|O_NOCTTY|O_NDELAY);
- if(devfd < 0)
- {
- perror("open error!\n");
- return (-1);
- }
- tcgetattr(devfd, &opt);
- opt.c_cflag |= CLOCAL | CREAD;
- opt.c_cflag &= ~PARENB;
- opt.c_cflag &= CSTOPB;
- opt.c_cflag &= ~CSIZE;
- opt.c_cflag |= CS8;
- opt.c_cc[VTIME] = 0;
- opt.c_cc[VMIN] = 0;
- opt.c_lflag &= ~(ICANON|ECHO|ECHOE|ISIG);
- cfsetospeed(&opt, B115200);
- tcsetattr(devfd, TCSANOW, &opt);
- str_len= strlen(addr);
- writ_len = write(devfd, addr, str_len);
- if(writ_len == str_len)
- printf("write success!\n");
- else if(writ_len == 0)
- printf("write nothing!\n");
- else
- {
- printf("write failed!\n");
- perror("write error");
- }
- close(devfd);
- return 0;
- }
- int main(){
- int sockfd,i, ip_arr_len;
- char *ip;
- char ip_arr[17]={};
- struct sockaddr_in *addr;
- struct ifreq ifr;
- while(1)
- {
- if((sockfd = socket(AF_INET, SOCK_DGRAM,0)) <0)
- {
- printf("socket error\n");
- exit(1);
- }
- memset(&ifr, 0, sizeof(ifr));
- strncpy(ifr.ifr_name, "eth0", sizeof("eth0"));
- //get ip
- if( (ioctl(sockfd, SIOCGIFADDR, &ifr)) == -1)
- {
- perror("ioctl error");
- exit(1);
- }
- addr = (struct sockaddr_in *)&ifr.ifr_addr;
- ip = inet_ntoa(addr->sin_addr);
- //printf("%s's ip is: %s\n", ifr.ifr_name, ip);
- for(i=0; (*ip)!='\0'; ip++)
- {
- ip_arr[i]=*ip;
- i++;
- }
- ip_arr[i]='@';
- ip_arr[i+1]='\0';
- //printf("ip_arr is %s\n", ip_arr);
- //ip_arr_len = strlen(ip_arr);
- //strncat(ip_ahead, ip_arr, ip_arr_len);
- printf("ip_arr is %s\n", ip_arr);
- serial_send(ip_arr);
- close(sockfd);
- memset(ip_arr, '\0', 17);
- sleep(4);
- }
- return 0;
- }
复制代码 这个是用popen调用ifconfig的程序- #include <stdio.h>
- #include <string.h>
- #include <stdlib.h>
- #include <errno.h>
- #include <unistd.h>
- #include <sys/socket.h>
- #include <sys/ioctl.h>
- #include <net/if.h>//ifconf ifreq
- #include <arpa/inet.h>//inet_aton
- #include <netinet/in.h>//sockaddr_in
- #include <sys/types.h>
- #include <sys/stat.h>
- #include <termios.h>
- #include <errno.h>
- #include <fcntl.h>
- int serial_send(char *addr){
- int devfd, writ_len, str_len;
- struct termios opt;
- devfd = open( "/dev/ttyUSB0", O_RDWR|O_NOCTTY|O_NDELAY);
- if(devfd < 0)
- {
- perror("open error!\n");
- return (-1);
- }
- tcgetattr(devfd, &opt);
- opt.c_cflag |= CLOCAL | CREAD;
- opt.c_cflag &= ~PARENB;
- opt.c_cflag &= CSTOPB;
- opt.c_cflag &= ~CSIZE;
- opt.c_cflag |= CS8;
- opt.c_cc[VTIME] = 0;
- opt.c_cc[VMIN] = 0;
- opt.c_lflag &= ~(ICANON|ECHO|ECHOE|ISIG);
- cfsetospeed(&opt, B115200);
- tcsetattr(devfd, TCSANOW, &opt);
- str_len= strlen(addr);
- writ_len = write(devfd, addr, str_len);
- if(writ_len == str_len)
- printf("write success!\n");
- else if(writ_len == 0)
- printf("write nothing!\n");
- else
- {
- printf("write failed!\n");
- perror("write error");
- }
- close(devfd);
- return 0;
- }
- int main()
- {
- char ip_arr[16]={};
- FILE *fp;
- while(1)
- {
- //灏嗗懡浠ょ殑杈撳嚭閫氳繃绠¢亾璇诲彇鍒癋ILE *fp
- if(NULL==(fp=popen("ifconfig eth0|sed -n '2p'|awk '{print $2}'|sed 's/addr://g'", "r")))
- {
- perror("popen:");
- return 1;
- }
- else
- {
- fread(ip_arr, sizeof(char), 16, fp);
- //printf("ip_arr's len is %d\n", strlen(ip_arr));
- printf(ip_arr);
- }
- pclose(fp);
- serial_send(ip_arr);
- memset(ip_arr, '\0', 16);
- sleep(4);
- }
- return 0;
- }
复制代码 |
|