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
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)
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 ?!