[C++] QString in inet_addr

[Moepi]1

Lt. Commander
Registriert
Jan. 2002
Beiträge
1.233
So jetzt weiß ich auch, warums unter Windows net geht. Ausnahmsweise kann ichs jetzt nicht auf M$ schieben, das Problem existiert unter Linux genauso:
Ich lese mittels QInputDialog::getText eine IP Adresse ein, wandle diese mit der Funktion "toInt" in nen Integer um und gebe das an mein Netzwerkmodul weiter. In der Praxis sieht das so aus:

Code:
void AppMainWindow::setServer()
{
	bool ok;
	server = QInputDialog::getText(this, tr("Connect to server"), tr("Server IP: "), QLineEdit::Normal, tr("172.16.0.13"), &ok);
	port = QInputDialog::getText(this, tr("Connect to server"), tr("Server Port: "), QLineEdit::Normal, tr("5000"), &ok);
	server_ip = server.toInt(&ok, 10);
	server_port = port.toInt(&ok, 10);
	connectToServer();
}

Die connectToServer() sieht dann (auszugsweise) aus:
Code:
	cli_sock_info.sin_addr.s_addr = htons(ip);
	cli_sock_info.sin_port = htons(port);

Das Konstrukt funktioniert bestens mit verschiedenen Ports und auch mit der Loopbackaddresse (127.0.0.1). Wenn ich allerdings ne andere IP Adresse (z. B. 172.16.0.13) angebe, dann scheint etwas bei der Umwandlung des QStrings in den Integer schief zu gehen (oder der Integer wird als ungültiger Wert in der Zeile cli_sock_info.sin_addr.s_addr = htons(ip) interpretiert).
Ersetze ich die Zeile "cli_sock_info.sin_addr.s_addr = htons(ip);" durch "cli_sock_info.sin_addr.s_addr = inet_address("172.16.0.13");" geht alles einwandfrei.

Was mach ich da wieder falsch? Oder kennt von Euch jemand nen einfachen Weg, nen QString in nen normalen String umzuwandeln? Oder den QString direkt als IP zu interpretieren? So falsch kann mein Ansatz ja wohl net sein - bei Angabe von 127.0.0.1 geht ja alles...
 
Wenn du den String "172.16.0.13" einliest sind doch noch die Punkte drin.
Wie soll ein String, der Punkte enthält sinnvoll in eine Integerzahl umgewandelt werden?

Versuche doch die Klasse QHostAddress(http://doc.trolltech.com/4.1/qhostaddress.html) zu nutzen.
 
Boron schrieb:
Wenn du den String "172.16.0.13" einliest sind doch noch die Punkte drin.
Wie soll ein String, der Punkte enthält sinnvoll in eine Integerzahl umgewandelt werden?

Versuche doch die Klasse QHostAddress(http://doc.trolltech.com/4.1/qhostaddress.html) zu nutzen.


Ja die Sache mit den Punkten in der IP hat mich auch stutzig gemacht. Interessanterweise klappts aber ja mit der 127.0.0.1 - versteh ich nicht.
QHostAddress - ich wollte eigentlich möglichst alle QT Netzwerklibs beiseite lassen, da ich nichts als Scherereien mit den Dingern hatte...
 
hast du den tipp aus dem letzten thread mit toAscii probiert? das ist der weg um aus einem QString einen normalen C String zu machen...

um aus dem String ein int zu machen müsstest du selber eine funktion schreiben(schließlich willst du ja keine vorgefertigten klassen nehmen :P). die punkte in einer IP addresse trennen die einzelnen bytes. du müsstest also als erstes den string in 4 einzelne aufteilen, diese dann jeweils in ein byte convertieren und das ganze dann zu einem int "umbauen".

low-level kram war noch nie meine stärke, daher habe ich keine ahnung wie die aus 4 bytes ein int bekommst - ich nehme allerdings mal an das du dafür jedes byte erstmal in ein int casten musst und dich dann ein wenig mit den bitoperatoren austoben darfst ;).
 
Siberian..Husky schrieb:
hast du den tipp aus dem letzten thread mit toAscii probiert? das ist der weg um aus einem QString einen normalen C String zu machen...

So bekomm ich es in nem QByteArray - wieder kein String... :(
Ich glaub ich mach morgen weiter...


/edit:
htons(ip) erwartet keinen Integer nach dem folgenden Schema:
127.0.0.1 = 7F 00 00 01 = 2130706433

Klappt so nicht


/edit:
Code:
server = QInputDialog::getText(this, tr("Connect to server"), tr("Server IP: "), QLineEdit::Normal, tr("127.0.0.1"), &ok).toAscii();
const char* server_ip;
server_ip = (const char*)server;
Dafür hab ich jetzt 4 Stunden gebraucht - heut is net mein Tag... :(
 
Zuletzt bearbeitet:
bitte die Qt doku auch zuende lesen! http://doc.trolltech.com/4.1/qbytearray.html#data

das wäre dann also deinString.toAscii().data();. Damit du nicht ständig selbst mit char arrays rumhantieren musst wenn du eines für andere bibliotheken brauchst erstellt qstring dir ein QByteArray. zwar gehen da einige tolle features von QString verloren, dafür kannst du das teil überall benutzen wo du ein char array brauchst, ohne der vielen probleme mit den dingern...

ein QByteArray ist also praktisch ein wrapper für char arrays... siehe: http://doc.trolltech.com/4.1/qbytearray.html#details

das hättest du ganz alein gefunden wenn du einfach mal nachgesehen hättest was ein QByteArray überhaupt ist ;).
 
Zuletzt bearbeitet:
Hallo,

also normalerweise nehme ich da inet_addr(). Das sollte es unter Windows und Linux geben. Nur das man eben einen char* braucht.
Und aus dem QString sollte man doch den Pointer herausbekommen?

MfG

Arnd
 
QString benutzt intern kein char array, das ding is unicode :P. wie man da ein char array draus machen kann steht ja aber nu schon weiter oben =).
 
Zurück
Oben