天天看点

ubuntu 12.04 读取和修改ip地址的程序

#include <stdio.h>
 #include <stdlib.h>
 #include <string.h>
 #include <sys/socket.h>
 #include <netinet/in.h>
 #include <arpa/inet.h>
 #include <sys/types.h>
 #include <sys/ioctl.h>
 #include "linux/if.h"
#include <unistd.h>

int GetLocalIp()
{

    int sock_get_ip;
    char ipaddr[50];

    struct   sockaddr_in *sin;
    struct   ifreq ifr_ip;   

    if ((sock_get_ip=socket(AF_INET, SOCK_STREAM, 0)) == -1)
    {
         printf("socket create failse...GetLocalIp!/n");
         return 0;
    }
    printf("socket create Success!...GetLocalIp!/n");
    memset(&ifr_ip, 0, sizeof(ifr_ip));   
    strncpy(ifr_ip.ifr_name, "eth0", sizeof(ifr_ip.ifr_name) - 1);   
 
    if( ioctl( sock_get_ip, SIOCGIFADDR, &ifr_ip) < 0 )   
    {   
         return 0;   
    }     
    sin = (struct sockaddr_in *)&ifr_ip.ifr_addr;   
    strcpy(ipaddr,inet_ntoa(sin->sin_addr));       
    
    printf("local ip:%s \n",ipaddr);    
    close( sock_get_ip );
    
    //return QString( ipaddr );
    return 0;
}


 int SetLocalIp( const char *ipaddr )  
{  
    int sock_set_ip;    
    struct sockaddr_in sin_set_ip;  
    struct ifreq ifr_set_ip;  
    bzero( &ifr_set_ip,sizeof(ifr_set_ip));  
    if( ipaddr == NULL )  
        return -1;  
  
    if((sock_set_ip = socket( AF_INET, SOCK_STREAM, 0 )) == -1) 
    {  
        perror("socket create failed...in SetLocalIp! \n");  
        return -1;  
    }   
    memset( &sin_set_ip, 0, sizeof(sin_set_ip));  
    strncpy(ifr_set_ip.ifr_name, "eth0", sizeof(ifr_set_ip.ifr_name)-1);     
    
    sin_set_ip.sin_family = AF_INET;  
    sin_set_ip.sin_addr.s_addr = inet_addr(ipaddr);  
    memcpy( &ifr_set_ip.ifr_addr, &sin_set_ip, sizeof(sin_set_ip));
    if( ioctl( sock_set_ip, SIOCSIFADDR, &ifr_set_ip) < 0 )  
    {  
        perror( "Not setup interface/n");  
        return -1;  
    }  
  
    //设置激活标志  
    ifr_set_ip.ifr_flags |= IFF_UP |IFF_RUNNING;  
    //get the status of the device  
    if( ioctl(sock_set_ip, SIOCSIFFLAGS, &ifr_set_ip ) < 0 )  
    {  
         perror("SIOCSIFFLAGS");  
         return -1;  
    }  
  
    close( sock_set_ip );  
    return 0;  
} 

int main(){
char str[]={'1','9','2','.','1','6','8','.','2','.','1','3','3'};
GetLocalIp();
SetLocalIp(str);
return 0;
}
           

注:本程序也是借鉴的代码,修改了其中的错误,必须在超级用户root权限下执行,否则只能读取ip,不能修改ip。

继续阅读