Err ocorreu usando ioctl para controlar minha placa de rede! [fechadas]

2

Recentemente instalei o Ubuntu11.10 em vez do antigo no meu computador.

Mas um bug estranho ocorreu durante o uso do IOCTL para controlar minha placa de rede usando o código como este:

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 sempre retorna false sob o Ubuntu11.10.O mesmo código é bom no Ubuntu10.04.

Outro fenômeno estranho aconteceu, eu posso reproduzir o bug toda vez que eu usei o código abaixo, mas depois de atualizar o sistema e instalar o gcc para o código do compilador. o bug não pode ser reproduzido.

Eu tenho contraste a dependência lib nas duas situações, a libc.so em duas situações são diferentes.

Mas eu substituí o mais novo no sistema ruim, eu posso reproduzir o bug novamente.

Estou confuso sobre isso !!!

Gostaria que alguém pudesse me ajudar !!

    
por CathyLuan 31.03.2012 / 08:19

0 respostas