port offen prüfen

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Frank aka Ch3ck3r
User
Beiträge: 49
Registriert: Dienstag 13. November 2007, 21:56
Wohnort: Berlin
Kontaktdaten:

Donnerstag 3. Januar 2008, 18:40

Hi Community.
Ich stehe im Moment vor dem Problem, dass ich prüfen muss ob ein Port offen ist (am Router). Also z.b. ob der Port 6667 für ingoing offen ist.

Das habe ich bis jetzt so gelöst:
1. Das laufenden Programm startet ein anderes Programm das sich als Server auf die lokale ip und den port setzt und auf eine Verbindung wartet.
2. Das laufende Programm versucht nun über die öffentliche IP auf den Port zu connecten und schaut nach einem timeout von 5 Sekunden ob die Verbindung erfolgreich war.
Wenn sie erfolgreich war dann ist der Port offen, ansonten ist er zu.

Das sieht bis jetzt so aus (Ausschnitte)
Das Programm:

Code: Alles auswählen

def checkport(self,ip,port):
        subprocess.Popen(r"portcheck\portcheck.exe "+str(port))
        try:
            sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            sock.settimeout(5)
            sock.connect((ip,port))
            sock.close()
        except:
            ip = socket.gethostbyname(socket.gethostname())
            sock = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
            sock.connect((ip,port))
            sock.close()            
            return False
        return True
Das 2. Programm zum prüfen des Ports (agiert als server)

Code: Alles auswählen

import socket
import sys

port = int(sys.argv[1])
print "hosthelper cheks if the port "+str(port)+" is open or not"
try:
    ip = socket.gethostbyname(socket.gethostname())
    server = socket.socket(socket.AF_INET,socket.SOCK_STREAM)
    server.bind((ip,port))
    server.listen(1)
    channel,details = server.accept()
    channel.close()
    sys.exit(0)
except:
    sys.exit(2)
Das funktioniert zwar, gefällt mir aber nicht wirklich. Mich stört z.B. das konsolen fenster das aufgeht durch den start des 2. Programmes.
Außerdem dauert das Prüfen lange (bis das programm an ist, dann connecten). Außerdem vergehen 5 Sekunden pro Port falls dieser geschlossen ist (bis das timeout halt "anspringt").

Deshalb wollte ich fragen ob es da eine bessere Möglichkeit gibt ?!
kostenlose TS2-Server für jeweils 31 Tage:
http://www.ts-onlyfree.de
Benutzeravatar
gerold
Python-Forum Veteran
Beiträge: 5555
Registriert: Samstag 28. Februar 2004, 22:04
Wohnort: Oberhofen im Inntal (Tirol)
Kontaktdaten:

Donnerstag 3. Januar 2008, 19:50

Hallo Frank!

Geht mit diesem Code das Konsolenfenster immer noch auf?

Code: Alles auswählen

APPDIR = os.path.dirname(os.path.abspath(sys.argv[0]))
PORTCHECK = os.path.join(APPDIR, r"portcheck\portcheck.exe")

args = [PORTCHECK, port]
proc = subprocess.Popen(args, stdout = subprocess.PIPE) 
proc.stdout.read()
mfg
Gerold
:-)
http://halvar.at | Kleiner Bascom AVR Kurs
Wissen hat eine wunderbare Eigenschaft: Es verdoppelt sich, wenn man es teilt.
Antworten