最近我在我的电脑上安装了 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是不同的。
但是我在有问题的系统中替换了较新的版本,我可以再次重现该错误。
我对此感到困惑!!!
希望有人能帮助我!!