Seite 1 von 1

[gelöst] Port-Angabe TCPServer

Verfasst: 21. Mai 2009 13:15
von Mineralwater
Ich hab mir die Beispiele in der Doku zu Fortuneclient und Fortuneserver angesehen und hab es leider nicht hinbekommen an dem Beispiel eine exakte Port-Angabe vorzunehmen.

Der Ausschnitt aus dem Beispiel...

Code: Alles auswählen

...
tcpServer = new QTcpServer(this);
tcpServer->listen(QHostAddress::LocalHost,7); <-- ergänzt
...
So wie ich das oben geschrieben hat, klappt es leider nicht.

Das Beispiel nutzt nämlich den Port 0 welcher laut Doku für eine automatische Port-Vergabe genutzt wird.
Da würde mich nebenbei auch interessieren woher der Server weiß welche Ports bereits in Benutzung waren, schließlich addiert er bei der Angabe von Port 0 (bspw. 55569) immer mit 1 sobald man diesen neu startet.


Viele Grüße aus`m Norden :)

Verfasst: 23. Mai 2009 12:53
von Mineralwater
hat denn keiner eine Idee?
Würde halt gerne wissen ob ich damit nun ganz falsch liege oder nun eigentlich doch richtig wäre. :(

Verfasst: 23. Mai 2009 13:13
von upsala
Der Server weis es nicht, aber das Betriebssystem.

Mal davon abgesehen, daß Ports unter 1024 nur vom Benutzer root geöffnet werden dürfen.

Verfasst: 23. Mai 2009 13:32
von Mineralwater
Naja ich bin der Root-Benutzer am Computer, quasi als Administrator angemeldet.
Aber ansich meinst du wäre es richtig?

Verfasst: 23. Mai 2009 13:54
von Christian81
Probiere bitte erstmal einen Port > 1024!

Verfasst: 23. Mai 2009 14:53
von Mineralwater
Naja das klingt nun vll etwas doof aber in Moment kann ich`s leider nicht ausprobieren, weil sobald ich Qt statisch neu kompiliere, funktioniert gar nix mehr. Ich muss es leider machen weil ich MySQL benötige.

http://qtforum.de/forum/viewtopic.php?t=9159

Hoffe ihr könnt mir helfen

Verfasst: 24. Mai 2009 21:23
von Mineralwater
Okay ich konnte wieder dort ansetzen, nun läuft mein Qt ja wieder.

Code: Alles auswählen

tcpServer = new QTcpServer(this); 
tcpServer->listen(QHostAddress::LocalHost,6246); <-- ergänzt 
Egal welchen Port ich verwende, auch überhalb der 1024 Marke, funktioniert es leider nicht. Er springt dann direkt, wie es auch im Beispiel zu finden ist, in die Schleife und gibt eine Meldung aus "Unable to Start the Server on Port ."

Nicht einmal der Port selbst wird durch die QMessageBox genannt, sondern nur der Punkt nach dem Port selbst.
tr("Unable to start.... Port %1.")...

Find ich sehr merkwürdig, hat da wer eine Idee oder nen Tipp?

Gruß Mineralwater

Verfasst: 24. Mai 2009 21:50
von upsala
Im Code gibt es keine Schleife. serverPort() gibt einen int zurück, somit gibt es immer einen Wert. Und woher weist du, daß der Server nicht funktioniert? nmap? lsof?

Verfasst: 25. Mai 2009 13:46
von Mineralwater
Oh sry tut mir leid, meinte auch gar nicht schleife sondern eine Bedingung.

Code: Alles auswählen

    if (!tcpServer->listen()) {
        QMessageBox::critical(this, tr("Fortune Server"),
                              tr("Unable to start the server: %1.")
                              .arg(tcpServer->errorString()));
        close();
        return;
    }
Dort springt er mir rein und lässt deswegen Meldung ausgeben die lautet
"Unable to start the server: ."
nmap? lsof?
Was genau meinst du damit? Google gab als Ergebnis einmal ein Firewall-Produkt und Isof eine Schulplatform. Weiß jetzt nicht so genau was du damit meinst.

Firewalls, wie ich gerade merke hab ich noch nicht angemerkt, sind alle aus.

Gruß

Verfasst: 25. Mai 2009 15:42
von NoRulez
Kurzum,

upsala meinte mit lsof/nmap vermutlich ob Du schon getestet hast ob auf dem Port schon etwas läuft bzw. Dein Server läuft.
Das Problem warum er Dir die Meldung ausgibt kann unter anderem auch sein das auf diesem Port bereits ein (anderer) Server/Dämon lauscht.
Du kannst auch mittels "netstat -an" überprüfen ob auf dem Port schon was läuft.

Also folgender Code läuft bei mir:

Code: Alles auswählen

 
.
.
.
QTcpServer *server = new QTcpServer;

if (!server->listen(QHostAddress::Any, 8080) {
    cout << QString("Unable to start the Server: %1.").arg(server->errorString()).toStdString() << endl;
    return app.exec();
}

cout << QString("The server is running on port %1.\n").arg(server->serverPort()).toStdString() << endl;
.
.
.
LG NoRulez

Verfasst: 6. Juni 2009 14:50
von Mineralwater
Nach einem Neustart von Qt hat der Code von NoRulez einwandfrei funktioniert.

Hab in letzter Zeit oft feststellen müssen das der Qt-Creator ganz gerne mal einen Neustart benötigt ;)