使用 ioctl 控制我的网卡时发生错误!

使用 ioctl 控制我的网卡时发生错误!

最近我在我的电脑上安装了 Ubuntu11.10 而不是旧版本。

但是当我使用 IOCTL 控制我的网卡时出现了一个奇怪的错误,代码如下:

struct ifreq ifr;
int socketFd = socket(PF_INET, SOCK_DGRAM, 0);
strncpy( ifr.ifr_name, m_NDISDevName.c_str(), IFNAMSIZ ) ;
if ( ioctl(socketFd, SIOCGIFFLAGS, &ifr ) < 0 )
{
    cout<<"_SyncNetInfoToSys device  down!!"  <<endl;
    _Cleanfd( socketFd ) ;
    return false ;
}
if( ifr.ifr_flags |~(IFF_UP) )
{
    ifr.ifr_flags |= IFF_UP ;
    ioctl(socketFd, SIOCSIFFLAGS, &ifr ) ;
}

//Set IP addr
struct sockaddr_in sin;
sin.sin_family = AF_INET ;
sin.sin_addr.s_addr = inet_addr( IPv4NetInfo.ipAddr.c_str() ) ;
cout<<_SyncNetInfoToSys ipv4 addr !!"  <<   IPv4NetInfo.ipAddr <<endl;
memcpy( &ifr.ifr_addr, &sin, sizeof( struct sockaddr_in )) ;

if( 0 == ioctl(socketFd, SIOCSIFADDR, &ifr ) )
{
    cout << _SyncNetInfoToSys   set ipv4 addr succ!!"  <<endl;
}
else
{
    cout<<_SyncIPv4NetInfoToSys   set ipv4 addr fail!!" <<endl;
    _Cleanfd( socketFd ) ;
    return false ;
}

ioctl 在Ubuntu11.10下总是返回false。同样的代码在Ubuntu10.04下是好的。

另一个奇怪的现象发生了,每次我使用下面的代码时都可以重现该错误,但是在我升级系统并安装 gcc 到编译器代码后,该错误无法重现。

我对比了两种情况下的依赖库,两种情况下的libc.so是不同的。

但是我在有问题的系统中替换了较新的版本,我可以再次重现该错误。

我对此感到困惑!!!

希望有人能帮助我!!

相关内容