Seite 1 von 1

Ip-Adresse mit hilfe von QT ändern

Verfasst: 3. April 2007 21:26
von vollkorn
Hallo QT'ler!

Ich möchte, wie schon im Topic beschrieben, die Ip-Adresse eines Netzwerkadapters mit hilfe von QT ändern. Unter windows wohlgemerkt. Geht das überhaupt?

Ich habte bereits verschiedene Lösungsansätze durchdacht. Da wäre zu einen der nette Konsolenbefehl "netsh" - Das ist schlecht da ich schließlich keine häßlich schwarze Box auf meinem Bildschirm will.

Dann wäre zum zweiten Win32/COM bzw. WMI - ehm ich programmiere QT weil ich damit eigentlich nichts zu tun haben möchte...
Gibts einen eleganten weg? :D

Verfasst: 3. April 2007 22:00
von upsala
Schon mal versucht netsh mit QProcess aufzurufen? Warum sollte da eine Konsole kommen?

Re: Ip-Adresse mit hilfe von QT ändern

Verfasst: 3. April 2007 22:15
von patrik08
vollkorn hat geschrieben:Hallo QT'ler!

Ich möchte, wie schon im Topic beschrieben, die Ip-Adresse eines Netzwerkadapters mit hilfe von QT ändern. Unter windows wohlgemerkt. Geht das überhaupt?

Ich habte bereits verschiedene Lösungsansätze durchdacht. Da wäre zu einen der nette Konsolenbefehl "netsh" - Das ist schlecht da ich schließlich keine häßlich schwarze Box auf meinem Bildschirm will.

Dann wäre zum zweiten Win32/COM bzw. WMI - ehm ich programmiere QT weil ich damit eigentlich nichts zu tun haben möchte...
Gibts einen eleganten weg? :D
sehr elegant ... und sogar auf alle OS... mit dem gleichen code....

ab QT4.3 oder sogar QT4.2 geht es ... QNetworkAddressEntry

http://doc.trolltech.com/qtopia4.2/qnet ... html#setIp

http://doc.trolltech.com/4.3-snapshot/q ... mbers.html

Code: Alles auswählen


/* nur um zu pruefen ob client mit dem netz verbunden ist .... */

static inline bool NetworkEnable() {

    bool validip = false;
    QList<QHostAddress> addrlist = QNetworkInterface::allAddresses();
    int o = -1;
    foreach(QHostAddress addr, addrlist){
    o++;
    QNetworkInterface hop = QNetworkInterface::interfaceFromIndex(o);
    QString mach = hop.hardwareAddress(); 
    QString name = hop.name();
    QString oneip = addr.toString();
        if (!oneip.contains("127.")) {
         bool actual = hop.isValid();
            if (actual) {
             validip = true;  
            }
         ////////qDebug() << "flags -> " <<  hop.flags();
         //////////qDebug() << "pi -> " << oneip << " valid ->" << validip << " MACADRESS->" << mach << " name ->" << name;
        }
    }
   //////qDebug() << "validip -> " <<  validip;
return validip;
}

Verfasst: 3. April 2007 22:28
von vollkorn
Hallo patrik,

Wo änderst du in deinem code denn die Ip, oder brauche ich eine Brille? Ich benutze zurzeit QT 4.2.2 (sollte ich updaten?)

Ich habe bereits versucht die Ip mittels Qnetworkaddressentry::setIp zu ändern, aber die Methode ändert doch nur die Ip innerhalbt des Obejkt oder auch im System? Also bei mir hat das zu keinem nennenswertem Ergebnis geführt :(

QProcess öffnet - zu meinem erstaunen - kein schwarzes Fenster, aber es ist halt noch keine schöne Lösung :(

Verfasst: 3. April 2007 22:38
von patrik08
vollkorn hat geschrieben:Hallo patrik,

Wo änderst du in deinem code denn die Ip, oder brauche ich eine Brille? Ich benutze zurzeit QT 4.2.2 (sollte ich updaten?)

Ich habe bereits versucht die Ip mittels Qnetworkaddressentry::setIp zu ändern, aber die Methode ändert doch nur die Ip innerhalbt des Obejkt oder auch im System? Also bei mir hat das zu keinem nennenswertem Ergebnis geführt :(

QProcess öffnet - zu meinem erstaunen - kein schwarzes Fenster, aber es ist halt noch keine schöne Lösung :(

Hier aus der qt doc geholt....

Zuerst macht du dir eine liste mit dem oben beispiel

QNetworkInterface hop = QNetworkInterface::interfaceFromIndex( int position);

dann machst du dir ein dialog um ip, gateway ,, broadcast ecc... zu editieren und zu setzen.... einfach cool...

im grunde aenderst du die parameter von QHostAddress .....

Code: Alles auswählen



void QNetworkAddressEntry::setBroadcast ( const QHostAddress & newBroadcast )

Sets the broadcast IP address of this QNetworkAddressEntry object to newBroadcast.

See also broadcast().
void QNetworkAddressEntry::setIp ( const QHostAddress & newIp )

Sets the IP address the QNetworkAddressEntry object contains to newIp.

See also ip().
void QNetworkAddressEntry::setNetmask ( const QHostAddress & newNetmask )

Sets the netmask that this QNetworkAddressEntry object contains to newNetmask.

See also netmask().



Verfasst: 3. April 2007 22:57
von patrik08
ich habe es genau angeschaut ... qt4.3 bei window ladet eine interne window dll

http://www.liutilities.com/products/win ... /iphlpapi/
mit der er ip holt und setzt...

ob es mit QT4.2 geht weiss ich nicht .... ich hatte keine icons gefunden bei 4.2 im model dir ... es ist mir 4.3 empfholen ... und siehe da alles perfekt....

Verfasst: 3. April 2007 23:28
von vollkorn
Dann weiß ich nicht wo der Fehler in meinem Code liegt...

Code: Alles auswählen


   //HostAdress Objekt mit neur Ip anlegen
    QHostAddress newHostAddress(new_ipaddress);

    //Adressen von Interface holen
    QList<QNetworkAddressEntry> AddressList;

    AddressList =  m_AllNetWorkInterfaces[n].addressEntries();

    //Ip-Adresse setzten
    AddressList[n].setIp(newHostAddress);

Die Methode die hier aufgerufen wird bekommt die neue Ip als QString und den Adapteraus der Liste n.

Die Ip ändert sich trotzdem nicht...

Verfasst: 4. April 2007 02:20
von patrik08
vollkorn hat geschrieben:Dann weiß ich nicht wo der Fehler in meinem Code liegt...

Code: Alles auswählen


   //HostAdress Objekt mit neur Ip anlegen
    QHostAddress newHostAddress(new_ipaddress);

    //Adressen von Interface holen
    QList<QNetworkAddressEntry> AddressList;

    AddressList =  m_AllNetWorkInterfaces[n].addressEntries();

    //Ip-Adresse setzten
    AddressList[n].setIp(newHostAddress);

Die Methode die hier aufgerufen wird bekommt die neue Ip als QString und den Adapteraus der Liste n.

Die Ip ändert sich trotzdem nicht...
Dann hast du eben version 4.2.0 ...... um nicht zu updaten ... geht es vielleicht
wenn du die class qnetworkinterface_win.cpp von qt4.3 nimst....

ftp://ftp.trolltech.com/qt/source/qt-wi ... .0beta.zip

http://www.trolltech.com/developer/task-tracker

Verfasst: 4. April 2007 09:05
von upsala
@patrik08: hast du es selbst schon mal probiert? Ich kann mir nicht vorstellen, daß das funktionieren soll...

Verfasst: 4. April 2007 09:44
von patrik08
upsala hat geschrieben:@patrik08: hast du es selbst schon mal probiert? Ich kann mir nicht vorstellen, daß das funktionieren soll...
Viele methode dieser class habe ich bereits getested ... auf 4.3beta && funktionieren ... ....
Dass ein QT team die class void QNetworkAddressEntry::setBroadcast ( const QHostAddress & newBroadcast ) als spass schreiben ... nur um die Doku auszufuellen und so zu tun dass es nicht geht .... kann ich mir absolut nicht vorstellen... dann ist es die erste dass nicht geht.... vonn der doku...

Von mir ist es auf window von iphlpapi.dll depend && admin berechtigung ...
&& qt version ... dass warum....

Heute aben wenn ich mehr zeit habe schreibe ich so ein dialog ... um ip zu committen....

Verfasst: 4. April 2007 12:15
von vollkorn
patrik08 hat geschrieben:
upsala hat geschrieben:@patrik08: hast du es selbst schon mal probiert? Ich kann mir nicht vorstellen, daß das funktionieren soll...
Viele methode dieser class habe ich bereits getested ... auf 4.3beta && funktionieren ... ....
Dass ein QT team die class void QNetworkAddressEntry::setBroadcast ( const QHostAddress & newBroadcast ) als spass schreiben ... nur um die Doku auszufuellen und so zu tun dass es nicht geht .... kann ich mir absolut nicht vorstellen... dann ist es die erste dass nicht geht.... vonn der doku...

Von mir ist es auf window von iphlpapi.dll depend && admin berechtigung ...
&& qt version ... dass warum....

Heute aben wenn ich mehr zeit habe schreibe ich so ein dialog ... um ip zu committen....
Ich kann mir, wie upsala schon sagte, nicht vorstellen das es funktioniert, obwohl dein Einwand, das so eine Methode nicht aus spaß da ist, schon berechtigt ist. Aber belehr mich eines besseren...

Verfasst: 4. April 2007 23:11
von patrik08
vollkorn hat geschrieben:hast du
Ich kann mir, wie upsala schon sagte, nicht vorstellen das es funktioniert, obwohl dein Einwand, das so eine Methode nicht aus spaß da ist, schon berechtigt ist. Aber belehr mich eines besseren...

Na... scheinbar ist es doch zum spass da.... und somit habe ich die erste QT class gefunden die nicht dass macht wass sie sollte ...

Auf linux hat man wenigstens einen /proc/ den man auslesen kann..

Richtig setzen kann ich nur ueber
QNetworkInterface::interfaceFromName(OsInterfacesName);
aber wenn die eths down sind kommt nichts in der liste....


obwohl ...
http://lists.trolltech.com/qt-interest/ ... 569-0.html
http://lists.trolltech.com/qt-interest/ ... 155-0.html

dass gegenteil verspricht....

melde doch ein bug ....


Code: Alles auswählen

void Load_Position( int netpos )
{
    const QString OsInterfacesName = net->itemData(netpos).toString();
    if (OsInterfacesName.size() < 1) {
    return;
    }
    QNetworkInterface hop = QNetworkInterface::interfaceFromName(OsInterfacesName);
    int ddi = hop.flags();
    qDebug() << "hop.flags()   >>> " << ddi;
    QList<QNetworkAddressEntry> allhop = hop.addressEntries();
    
    foreach(QNetworkAddressEntry eth, allhop) {
        if (allhop.size() == 1 ) {
        /* window os on name ---  linux eth0:1 eth0:1 ecc... virtual ip  */
        actual = eth;  
        }
        wbroad->setText(eth.broadcast().toString());
        wmask->setText(eth.netmask().toString());
        wip->setText(eth.ip().toString());          
    }
    if ( wip->text().size() > 0 || wmask->text().size() > 0 || hop.isValid() ) {
        /* have it */
        qDebug() << " valid config && running  ";
        /* enable button to chance ip */
        wset->setEnabled(true);
    } else {
        wset->setEnabled(false);
    }
 
}



Schade... dann mache es einfach primitiv.... wie upsala meinte....
alle window kommen irgendann ins museum .... :-)
### backup ip config
netsh -c interface dump>c:\today.txt
### put other data... to today.txt
### load ip config
netsh -f c:\today.txt

Of topic....
Die OS Mac ip config ist richtig luxus gegenueber window... mit applescripts