原创 linux应用编程之网络(3)-网络参数的设置

2011-3-3 21:06 2056 7 7 分类: MCU/ 嵌入式

好久没更新博客了,2011年了,也得有个开端才行,所以特意对linux应用编程做了一些总结,现晒出来,希望能给大家一点参考,同时也作为自己的备忘录,何乐而不为之................(学海无涯)-------------------------------------------water

            网络编程(3)——网络参数的设置

5网络相关参数的设置(ip,gateway,netmask)

这些参数的设置可以调用system()函数来,执行一些命令完成。如system(ifconfig eth0 192.168.14.34)等,也可以编写一些函数如下面这个:/********************************************************************

* 函数名: set_ip

* 参数名: char *ip (in)

*     

* 返回值: 0                成功

*         -1              失败

* 功  能:  设置本机ip地址 为char *ip所指定的字符串ip

* 版本  :  water-2010-07-08--first

********************************************************************/

int set_ip(char *ip)

{

    struct ifreq temp;

    struct sockaddr_in *addr;

    int fd = 0;

    int ret = -1;

    strcpy(temp.ifr_name, "eth0");

    if((fd=socket(AF_INET, SOCK_STREAM, 0))<0)

    {

        perror("socket");

        return -1;

    }

    addr = (struct sockaddr_in *)&(temp.ifr_addr);

    addr->sin_family = AF_INET;

    addr->sin_addr.s_addr = inet_addr(ip);

    ret = ioctl(fd, SIOCSIFADDR, &temp);

    close(fd);

    if(ret < 0)

    {

        perror("ioctl");   

        return -1;

    }

    return 0;

}

然而这样系统重启后起IP一般会变回原来。因为一般系统启动后都会调用一个配置文件来设置相关网络地址。如PC上的linux一般会有/etc/sysconfig/network-scripts/ifcfg-eth0

而一般的嵌入式linux则不会有。所以在pc上我们可以修改这个配置文件,记得曾经在网上找到几个读取,修改该配置文件的几个函数,现在贴出来:

/********************************************************************

* 函数名: ReadConfig(char *conf_path,char *conf_name,char *config_buff)

* 参数名: char *conf_path

*      char *conf_name

        char *config_buff

* 返回值:  no

* 功  能:  从配置文件中读取相应的值输入参数:1,配置文件路径 2,匹配标记 3,输出存储空间

 *      并且排除了空行,“=”前后无内容,无“=”的情况

 

* 版本  :  water-2010-07-08--first

********************************************************************/

 

 

int ReadConfig(char *conf_path,char *conf_name,char *config_buff)

{

    char config_linebuf[256];

    char line_name[40];

    char exchange_buf[256];

    char *config_sign = "=";

    char *leave_line;

    FILE *f;

    f = fopen(conf_path,"r");

    if(f == NULL)

    {

        printf("OPEN CONFIG FALID\n");

        return 0;

    }

    fseek(f,0,SEEK_SET);

    while(fgets(config_linebuf,256,f) != NULL)

    {  

        if(strlen(config_linebuf) < 3) //判断是否是空行

        {

            continue;

        }

        if (config_linebuf[strlen(config_linebuf)-1] == 10) //去除最后一位是\n的情况

        {

           

            memset(exchange_buf,0,sizeof(exchange_buf));

            strncpy(exchange_buf,config_linebuf,strlen(config_linebuf)-1);

            memset(config_linebuf,0,sizeof(config_linebuf));

            strcpy(config_linebuf,exchange_buf);

        }

        memset(line_name,0,sizeof(line_name));

        leave_line = strstr(config_linebuf,config_sign);

        if(leave_line == NULL)                            //去除无"="的情况

        {

            continue;

        }

        int leave_num = leave_line - config_linebuf;

        strncpy(line_name,config_linebuf,leave_num);

        if(strcmp(line_name,conf_name) ==0)

        {

            strncpy(config_buff,config_linebuf+(leave_num+1),strlen(config_linebuf)-leave_num-1);

            break;

        }

        if(fgetc(f)==EOF)

        {

            break; 

        }

        fseek(f,-1,SEEK_CUR);

        memset(config_linebuf,0,sizeof(config_linebuf));

    }

    fclose(f);

}

 

/********************************************************************

* 函数名: ReadConfig(char *conf_path,char *conf_name,char *config_buff)

* 参数名: char *conf_path

*      char *conf_name

        char *config_buff

* 返回值:  no

* 功  能:  添加修改文件(当配置文件中存在标记字段,则进行修改,若不存在则进行添加)

        输入参数:1,配置文件路径 2,匹配标记 3,替换或添加的内容

 

* 版本  :  water-2010-07-08--first

********************************************************************/

 

int AddOrAltConfig(char *conf_path,char *conf_name,char *config_buff)

{

   

    char config_linebuf[256];

    char line_name[40];

    char *config_sign = "=";

    char *leave_line;

    int  alter_sign = 0;

   

    FILE *f;

    f = fopen(conf_path,"r+");

    if(f == NULL)

    {

        printf("OPEN CONFIG FALID\n");

        return 0;

    }

    fseek(f,0,SEEK_END);

    long congig_lenth = ftell(f);

    int configbuf_lenth = strlen(config_buff);

    configbuf_lenth = configbuf_lenth + 5;

    char sum_buf[congig_lenth+configbuf_lenth];

    memset(sum_buf,0,sizeof(sum_buf));

    fseek(f,0,SEEK_SET);

    while(fgets(config_linebuf,256,f) != NULL)

    {  

        if(strlen(config_linebuf) < 3) //判断是否是空行

        {

            strcat(sum_buf,config_linebuf);

            continue;

        }

        leave_line = NULL;

        leave_line = strstr(config_linebuf,config_sign);

        if(leave_line == NULL)                            //去除无"="的情况

        {

            strcat(sum_buf,config_linebuf);

            continue;

        }

        int leave_num = leave_line - config_linebuf;

        memset(line_name,0,sizeof(line_name));

        strncpy(line_name,config_linebuf,leave_num);

        if(strcmp(line_name,conf_name) ==0)

        {

            strcat(sum_buf,config_buff);

            strcat(sum_buf,"\n");

            alter_sign = 1;

        }

        else

        {

            strcat(sum_buf,config_linebuf);

        }

        if(fgetc(f)==EOF)

        {

            break; 

        }

        fseek(f,-1,SEEK_CUR);

        memset(config_linebuf,0,sizeof(config_linebuf));

    }

    if(alter_sign == 0)

    {

        strcat(sum_buf,config_buff);

        strcat(sum_buf,"\n");

    }

    printf("---sum_buf---->%s<----------\n",sum_buf);

    remove(conf_path);

    fclose(f);

    FILE *fp;

    fp = fopen(conf_path,"w+");

    if(fp == NULL)

    {

        printf("OPEN CONFIG FALID\n");

        return 2;

    }

    fseek(fp,0,SEEK_SET);

    fputs(sum_buf,fp);

    fclose(fp);

}

 

 

/********************************************************************

* 函数名: ReadConfig(char *conf_path,char *conf_name,char *config_buff)

* 参数名: char *conf_path

*      char *conf_name

        char *config_buff

* 返回值:  no

* 功  能:  删除配置文件内容输入参数:1,配置文件路径 2,匹配标记

 

* 版本  :  water-2010-07-08--first

********************************************************************/

 

int DeleteConfig(char *conf_path,char *conf_name)

{

   

    char config_linebuf[256];

    char line_name[40];

    char *config_sign = "=";

    char *leave_line;

   

    FILE *f;

    f = fopen(conf_path,"r+");

    if(f == NULL)

    {

        printf("OPEN CONFIG FALID\n");

        return 0;

    }

    fseek(f,0,SEEK_END);

    long congig_lenth = ftell(f);

    char sum_buf[congig_lenth+2];

    memset(sum_buf,0,sizeof(sum_buf));

    fseek(f,0,SEEK_SET);

    while(fgets(config_linebuf,256,f) != NULL)

    {  

        if(strlen(config_linebuf) < 3) //判断是否是空行

        {

            strcat(sum_buf,config_linebuf);

            continue;

        }

        leave_line = NULL;

        leave_line = strstr(config_linebuf,config_sign);

        if(leave_line == NULL)                            //去除无"="的情况

        {

            strcat(sum_buf,config_linebuf);

            continue;

        }

        int leave_num = leave_line - config_linebuf;

        memset(line_name,0,sizeof(line_name));

        strncpy(line_name,config_linebuf,leave_num);

        if(strcmp(line_name,conf_name) ==0)

        {

           

        }

        else

        {

            strcat(sum_buf,config_linebuf);

        }

       

        if(fgetc(f)==EOF)

        {

            break; 

        }

        fseek(f,-1,SEEK_CUR);

        memset(config_linebuf,0,sizeof(config_linebuf));

    }

    printf("---sum_buf---->%s<----------\n",sum_buf);

    remove(conf_path);

    fclose(f);

    FILE *fp;

    fp = fopen(conf_path,"w+");

    if(fp == NULL)

    {

        printf("OPEN CONFIG FALID\n");

        return 2;

    }

    fseek(fp,0,SEEK_SET);

    fputs(sum_buf,fp);

    fclose(fp);

}

 

其实这样干实在是走了弯路。我们可以自己写个开机运行的与网络相关参数有关的脚本;

如:自己写个net_cfg.sh 如下:

#!/bin/shell

/sbin/ifconfig eth0 192.168.14.207 netmask 255.255.0.0 up

/sbin/route del default

/sbin/route add default gw  192.168.14.254

若想修改相关信息,则直接把该脚本删除了,再创建一个新的,其中写入新的配置信息即可。当然为了想要修改的信息及时起效,可以同时调用system(ifconfig......),使其ip,gateway,netmask等及时修改,这样在重启后,系统读取新的脚本,也达到了修改的目的。

PARTNER CONTENT

文章评论0条评论)

登录后参与讨论
我要评论
0
7
关闭 站长推荐上一条 /3 下一条