Entwickler-Ecke
Internet / Netzwerk - Port besetzt?
Eddy14 - Do 30.11.06 22:09
Titel: Port besetzt?
Hallo, da ich zurzeit ein Multiplayer Spiel mit den Tserver/TClientsockets programmiere, würde ich es gerne vermeiden das mein Programm 2mal gestartet wird um mit 2 Accounts zu spielen. Also hab ich mir gedacht ich schau einfach ob mein Port schon benutzt wird. Wenn ja, heißt das mein Programm ist schon einmal gestartet worden.
Also: Kann ich irgendwie feststellen ob ein Port benutzt wird?
PS: Bei den Server/Clientsockets kann man irgendwie einen Port 2 oder mehrfach verwenden ohne jegliche error. Die Suche hab ich auch schon verwendet...
alias5000 - Do 30.11.06 22:38
Naja, du kannst mehrere Clientverbindungen auf einem PC zu anderen PCs über einen Port laufen lassen, aber es kann an einem PC nur ein Server auf einem Port lauschen.
Daher könntest du einfach mal nen Server auf dem gewünschten Port auf active stellen und wenn er dir ne entsprechende Fehlermeldung ausspuckt, weißt du, dass der Port bereits belegt ist.
Gruß alias5000
Narses - Do 30.11.06 23:06
Moin!
Verhindere doch einfach, dass die Anwendung ein weiteres mal gestartet werden kann. Geht z.B. mit einem
MUTEX, alternative Suchbegriffe:
MEHRFACHSTART
Ist IMHO sicher besser, als das portbasiert zu machen. ;)
cu
Narses
alias5000 - Do 30.11.06 23:13
Bei nem Mutex hast du halt das Problem, dass der weiterexistiert, auch wenn deine Anwendung abstürtzt.
N Porttest kann eh nicht schaden, es könnte ja der dumme Zufall sein, dass da schon ein anderes Programm drauf lauscht. Aber klar, um mehrere Instanzen zu verhindern, gibt es wirksamere Methoden, Narses hat den entsprechenden Hinweis ja schon gegeben.
Gruß alias5000
Narses - Do 30.11.06 23:15
Moin!
alias5000 hat folgendes geschrieben: |
| Bei nem Mutex hast du halt das Problem, dass der weiterexistiert, auch wenn deine Anwendung abstürtzt. |
try-finally... 8) sag ich nur. ;)
alias5000 hat folgendes geschrieben: |
| N Porttest kann eh nicht schaden, es könnte ja der dumme Zufall sein, dass da schon ein anderes Programm drauf lauscht. |
Hatte auch erst "überlesen", dass er den Client(!) meint! Aber man kann eh nicht wirklich verhindern, dass einer zwei Accounts gleichzeitig nutzt (-> 2. Rechner...). :|
cu
Narses
alias5000 - Do 30.11.06 23:29
Narses hat folgendes geschrieben: |
alias5000 hat folgendes geschrieben: | | Bei nem Mutex hast du halt das Problem, dass der weiterexistiert, auch wenn deine Anwendung abstürtzt. |
try-finally... 8) sag ich nur. ;) |
Hm? Wie willst du das dann genau lösen? Um zu jedem Zeitpunkt, an dem das Programm läuft, über Mutexe den Spaß feststellen zu können, muss ich doch ständig nen Mutex laufen haben. Und ich kann ja nich des ganze programm in try...finally setzen...
Gruß alias5000
Narses - Do 30.11.06 23:32
Moin!
So, z.B.: ;)
Delphi-Quelltext
1: 2: 3: 4: 5:
| try Application.Run; finally end; |
cu
Narses
alias5000 - Do 30.11.06 23:35
hm, ja müsst ich mal ausprobieren :lol:
jetzt denk ich aber mal, dass ein halbes back to topic drinnen wäre (ganz warn wir ja noch net vom Topic weg ;) )
Eddy14 - Fr 01.12.06 16:54
Wow, danke für die Antworten. Habs gelöst mit mutex.
Naja, wenigstens werde ich meinen Bruder davon abhalten mit 2 accounts gegen mich zu spielen :P
So siehts nun bei mir aus :
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| mHandle := CreateMutex(nil, True, 'Cold-War Onlinegame'); if GetLastError = ERROR_ALREADY_EXISTS then begin ShowMessage('Nana, versuch nicht zu schummeln ^^'); Application.Terminate(); end; |
Danke euch :)
Udontknow - Fr 01.12.06 17:52
Narses hat folgendes geschrieben: |
Moin!
alias5000 hat folgendes geschrieben: | | Bei nem Mutex hast du halt das Problem, dass der weiterexistiert, auch wenn deine Anwendung abstürtzt. |
try-finally... 8) sag ich nur. ;)
|
Es gibt so böse Fehler, die lassen die Applikation sang & klanglos abstürzen, da hilft auch kein try/finally. Was, wenn ein Programm "hängt", und man muss es per Taskmanager killen?
Die bessere Lösung ist die Verwendung von Semaphores, die werden sogar bei brutalem Abschiessen vom Betriebssystem wieder weggeräumt.
Edit: Hier Beispielcode:
Delphi-Quelltext
1: 2: 3: 4: 5: 6:
| FSemaphore := CreateSemaphore(nil, 1, 1, PChar('MEINPROGRAMM'));
if (GetLastError = ERROR_ALREADY_EXISTS) then raise Exception.Create('Semaphore existiert bereits!'); |
Cu,
Udontknow
Entwickler-Ecke.de based on phpBB
Copyright 2002 - 2011 by Tino Teuber, Copyright 2011 - 2026 by Christian Stelzmann Alle Rechte vorbehalten.
Alle Beiträge stammen von dritten Personen und dürfen geltendes Recht nicht verletzen.
Entwickler-Ecke und die zugehörigen Webseiten distanzieren sich ausdrücklich von Fremdinhalten jeglicher Art!