Computer und Port bereit ?

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
Elektrolurch
Beiträge: 168
Registriert: 11.10.2007 16:48
Wohnort: 49°26'51.46"N - 8°59'49.06"E
Kontaktdaten:

Computer und Port bereit ?

Beitrag von Elektrolurch »

Hallo

ich habe mal wieder, ein kleines Problem für die Menschheit, aber ein großes Problem für mich.

In meinem Programm spreche ich über Telnet einen Linux basierenden MP3Player an um ihn zu modifizieren.
Ich habe nur folgendes Problem wenn ich oder ein User vergessen, den Player oder den darauf laufenden Telnet Server einzuschalten, dann hängt mein Programm ca 45Sekunden und wartet auf eine Antwort.

Ich starte die Verbindung mit

Code: Alles auswählen

Verbindung = OpenNetworkConnection(IP_Adresse.s, 23)
Ich fange auch das Nullergebnis ab, aber es dauert halt ewig lange, was manche User zu den lustigsten Aktionen veranlaßt.
Kann man nicht mit einer Art kurzem Ping checken ob der PC antwortet?
Am besten gleich ob der Port aktiv ist?
Oder kann man den Timout verkürzen?

Ich hoffe ihr könnt mir helfen.

BYe André
Wer Rechtschreibfehler findet darf sie ruhig behalten, ich brauche sie nicht mehr, ich habe noch genug davon.
BildBildBild
Benutzeravatar
HeX0R
Beiträge: 3042
Registriert: 10.09.2004 09:59
Computerausstattung: AMD Ryzen 7 5800X
96Gig Ram
NVIDIA GEFORCE RTX 3060TI/8Gig
Win11 64Bit
G19 Tastatur
2x 24" + 1x27" Monitore
Glorious O Wireless Maus
PB 3.x-PB 6.x
Oculus Quest 2 + 3
Kontaktdaten:

Re: Computer und Port bereit ?

Beitrag von HeX0R »

Ich packe OpenNetworkConnection grundsätzlich in einen Thread (eben wegen den von dir geschilderten Problemen).
Das Hauptprogramm bleibt dann bedienbar und durch einen Cancel-Button wird der Thread einfach gekillt, wenn es zu lange dauert.
In dem Fall, wenn nichts anderes in dem Thread passiert, ist ein KillThread auch gar nicht so böse :mrgreen:

Davon abgesehen, würde aber in deinem Fall auch noch ein anpingen helfen.
Vorrausgesetzt der MP3Player reagiert darauf überhaupt.
Benutzeravatar
Elektrolurch
Beiträge: 168
Registriert: 11.10.2007 16:48
Wohnort: 49°26'51.46"N - 8°59'49.06"E
Kontaktdaten:

Re: Computer und Port bereit ?

Beitrag von Elektrolurch »

Hi HeXOR

ich habs jetzt mal wirklich mit Threads gestaltet.
Das ergab allerdings gleich die nächsten Probleme.
In der Zeit in der die Verbindung aufgebaut wird und die Anwendung jetzt nicht mehr blockiert ist, kann man die eigentlichen Befehle über den Telnet schon drücken. :cry:
Ich habe sie nun bis zum Abschluß des verbindens einfach ausgeblendet. <)

Nun muß der User halt bei dem obigen Fehler eine Minute auf ausgeblendete Menüs schauen. :lol:
So ein kleiner Ping wäre doch noch die bessere Lösung.
Keiner was im Peto?

Bye André
Wer Rechtschreibfehler findet darf sie ruhig behalten, ich brauche sie nicht mehr, ich habe noch genug davon.
BildBildBild
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Computer und Port bereit ?

Beitrag von Bisonte »

Ich hab vor längerer Zeit mal ein "OpenNetwork" mit einem Timeout gefunden, weiss aber leider nicht mehr wo,
und wer den schrieb... aber ich poste ihn hier mal :

Timeout wird hierbei in Sekunden angegeben !

Mit dieser Prozedur, teste ich immer aus, ob der Server überhaupt da ist.
Eigentlich reicht eine Sekunde als Timeout, wenn der Port erreichbar ist, springt er eh gleich weiter ...

Code: Alles auswählen

Procedure.i OpenNetworkEx(ServerName.s,Port.l,TimeOut.l = 1,Type.l = #PB_Network_TCP) ; TimeOut in Sekunden

;##### Von Sicro : 
;##### Forenbeitrag : http://purebasic.fr/german/viewtopic.php?t=5192&start=38
  
  Protected WSAD.WSADATA, TV.TIMEVAL, Addr.SOCKADDR_IN, *HostInfo.HOSTENT, Write_FD.FD_SET
  Protected S.l, Switch.l, Retval.l, ServerIP.s
  
  TV\tv_sec = TimeOut
  Switch = #True
 
  If Type = #PB_Network_UDP
    ProcedureReturn OpenNetworkConnection(ServerName,Port,#PB_Network_UDP)
  EndIf
 
  If WSAStartup_($202,@WSAD)
    ProcedureReturn #False
  EndIf
 
  *HostInfo = gethostbyname_(@ServerName)
  If *HostInfo
    ServerIP = StrU(PeekB(PeekL(*HostInfo\h_addr_list)),0) + "."
    ServerIP + StrU(PeekB(PeekL(*HostInfo\h_addr_list) + 1),0) + "."
    ServerIP + StrU(PeekB(PeekL(*HostInfo\h_addr_list) + 2),0) + "."
    ServerIP + StrU(PeekB(PeekL(*HostInfo\h_addr_list) + 3),0)
  EndIf

  S = SOCKET_(#AF_INET,#SOCK_STREAM,#IPPROTO_TCP)
  If S = #SOCKET_ERROR
    WSACleanup_()
    ProcedureReturn #False
  EndIf
 
  ioctlsocket_(S,#FIONBIO,@Switch)
 
  With Addr
    \sin_addr = inet_addr_(ServerIP)
    \sin_port = htons_(Port)
    \sin_family = #AF_INET
  EndWith
  connect_(S,@Addr,SizeOf(Addr))
 
  With Write_FD
    \fd_count = 1
    \fd_array[0] = S
  EndWith
  Repeat
    Retval = select_(0,0,@Write_FD,0,@TV)
  Until Retval >= 0
 
  closesocket_(S)
  WSACleanup_()
  
  If Retval
    ProcedureReturn OpenNetworkConnection(ServerName,Port)
  EndIf
EndProcedure

InitNetwork()

Result = OpenNetworkEx("www.meinserver.de",8085, 1)

If Result
  Debug "Server Online"
Else
  Debug "Server Offline"
EndIf

Zuletzt geändert von Bisonte am 11.03.2011 18:47, insgesamt 1-mal geändert.
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Shardik
Beiträge: 746
Registriert: 25.01.2005 12:19

Re: Computer und Port bereit ?

Beitrag von Shardik »

Bisonte hat geschrieben:Ich hab vor längerer Zeit mal ein "OpenNetwork" mit einem Timeout gefunden, weiss aber leider nicht mehr wo,
und wer den schrieb...
Sicro: http://www.purebasic.fr/german/viewtopi ... 2&start=38
Benutzeravatar
Elektrolurch
Beiträge: 168
Registriert: 11.10.2007 16:48
Wohnort: 49°26'51.46"N - 8°59'49.06"E
Kontaktdaten:

Re: Computer und Port bereit ?

Beitrag von Elektrolurch »

Hi

Ich habe mittlerweile selbst einen kleinen Ping gebastelt.

Code: Alles auswählen

#PING_TIMEOUT = 1000
Global IP.s   = "192.168.72.1"

Procedure Ping ()
  lngHPort     = IcmpCreateFile_()
  strMessage.s = "Echo This Message back to me"
  MsgLen       = Len(strMessage)
  *buffer      = AllocateMemory(SizeOf(ICMP_ECHO_REPLY) + MsgLen)
  lngDAddress  = MakeIPAddress(Val(StringField(IP.s, 1, ".")), Val(StringField(IP.s, 2, ".")), Val(StringField(IP.s, 3, ".")), Val(StringField(IP.s, 4, ".")))
  ECHO.ICMP_ECHO_REPLY
  If IcmpSendEcho_(lngHPort, lngDAddress, @strMessage, MsgLen, #Null, *buffer, SizeOf(ICMP_ECHO_REPLY) + MsgLen, #PING_TIMEOUT)
    CopyMemory(*Buffer, ECHO, SizeOf(ICMP_ECHO_REPLY))
    PTime.f = ECHO\RoundTripTime
    ProcedureReturn PTime.f
  Else
    ProcedureReturn 0
  EndIf
EndProcedure
If Ping ()
   Debug "Starte Telnet"
Else
  Debug "Keine Chance IP gibt es nicht"
EndIf
Damit sehe ich innerhalb einer Sekunde ob die IP (das Gerät) vorhanden ist.
Der gesperrte Port kommt sowieso schnell mit der Ablehnung zurück.
Also alles wieder gut.

BYe André
Wer Rechtschreibfehler findet darf sie ruhig behalten, ich brauche sie nicht mehr, ich habe noch genug davon.
BildBildBild
Benutzeravatar
Bisonte
Beiträge: 2468
Registriert: 01.04.2007 20:18

Re: Computer und Port bereit ?

Beitrag von Bisonte »

Shardik hat geschrieben:
Bisonte hat geschrieben:Ich hab vor längerer Zeit mal ein "OpenNetwork" mit einem Timeout gefunden, weiss aber leider nicht mehr wo,
und wer den schrieb...
Sicro: http://www.purebasic.fr/german/viewtopi ... 2&start=38
Danke ;)

Werd ich gleich mal als kommentar einbauen ...

P.S.:
@Elektrolurch :Wenn ich deinen Ping nutze, sagt der mir IMMER offline ...(Ja : Die IP existiert)
Und ich kann auch nirgends den Port entdecken den du dort nutzen willst....
Hilf mir mal auf die Sprünge bitte ;)
PureBasic 6.21 (Windows x86/x64) | Windows11 Pro x64 | AsRock B850 Steel Legend Wifi | R7 9800x3D | 64GB RAM | GeForce RTX 5080 | ThermaltakeView 270 TG ARGB | build by vannicom​​
Benutzeravatar
Elektrolurch
Beiträge: 168
Registriert: 11.10.2007 16:48
Wohnort: 49°26'51.46"N - 8°59'49.06"E
Kontaktdaten:

Re: Computer und Port bereit ?

Beitrag von Elektrolurch »

Hi Bisonte

ich habe den Ping heute Miitag in der Pause gebastelt.
Er lief unter XP.
Nun habe ich Zuhause den Code von hier unter Win 7 laufen lassen und er läuft auch.
Ich kann also momentan deine Probleme nicht nachvollziehen.
Ich muß gestehen das meiste ist "gegutenbergt".

Ich habe es auch nur dem
Verbindung = OpenNetworkConnection(IP_Adresse.s, 23)
voran gestellt. Damit habe ich das ausgeschaltete Gerät und das ewige warten bis zum Fehler auf eine Sekunde reduziert.
Kommt der Ping nicht durch breche ich die Aktion mit der Fehlermeldung "Gerät nicht Online" ab.
Klappt der Ping ist das Gerät Online und ich kann versuchen den den Port zu öffnen. Ist der Telnet deaktiviert, wird ja die Anfrage sofort abgelehnt. Somit kann ich sagen Gerät läuft aber Telnet deaktiviert. Erhalte ich Zugang ist alles in Ordnung und ich "bin drin" :allright:

Ich hoffe ich konnte mich verständlich ausdrücken.

Warum es bei dir aber nicht läuft, bringt mich ins grübeln.
Die IP kannst du mit einem anderen Programm anpingen?
Den evtl. Umbruch in der langen Zeile, der IP Erzeugung?
Pingzeit zu lange? evtl Timeout verlängern?

Gibt es hier jemanden bei dem es auch geht, oder auch nicht geht?

BYe André
Wer Rechtschreibfehler findet darf sie ruhig behalten, ich brauche sie nicht mehr, ich habe noch genug davon.
BildBildBild
Benutzeravatar
ts-soft
Beiträge: 22292
Registriert: 08.09.2004 00:57
Computerausstattung: Mainboard: MSI 970A-G43
CPU: AMD FX-6300 Six-Core Processor
GraKa: GeForce GTX 750 Ti, 2 GB
Memory: 16 GB DDR3-1600 - Dual Channel
Wohnort: Berlin

Re: Computer und Port bereit ?

Beitrag von ts-soft »

Elektrolurch hat geschrieben: Gibt es hier jemanden bei dem es auch geht, oder auch nicht geht?

BYe André
"192.168.220.100" geht nicht (mein PC)
"192.168.220.1" geht (Router)
PureBasic 5.73 LTS | SpiderBasic 2.30 | Windows 10 Pro (x64) | Linux Mint 20.1 (x64)
Nutella hat nur sehr wenig Vitamine. Deswegen muss man davon relativ viel essen.
Bild
Benutzeravatar
Elektrolurch
Beiträge: 168
Registriert: 11.10.2007 16:48
Wohnort: 49°26'51.46"N - 8°59'49.06"E
Kontaktdaten:

Re: Computer und Port bereit ?

Beitrag von Elektrolurch »

Hi
Danke ts-soft du hast mich auf den richtigen Weg gebracht.
Ich habe es einmal modifiziert.

Code: Alles auswählen

#PING_TIMEOUT = 1000
Global IP.s   = "192.168.1.3"

Procedure Ping ()
  lngHPort     = IcmpCreateFile_()
  strMessage.s = "Echo This Message back to me"
  MsgLen       = Len(strMessage)
  *buffer      = AllocateMemory(SizeOf(ICMP_ECHO_REPLY) + MsgLen)
  lngDAddress  = MakeIPAddress(Val(StringField(IP.s, 1, ".")), Val(StringField(IP.s, 2, ".")), Val(StringField(IP.s, 3, ".")), Val(StringField(IP.s, 4, ".")))
  ECHO.ICMP_ECHO_REPLY
  If IcmpSendEcho_(lngHPort, lngDAddress, @strMessage, MsgLen, #Null, *buffer, SizeOf(ICMP_ECHO_REPLY) + MsgLen, #PING_TIMEOUT)
    CopyMemory(*Buffer, ECHO, SizeOf(ICMP_ECHO_REPLY))
    PTime.f =  ECHO\RoundTripTime
    If PTime.f < 1 : PTime.f = 1 :EndIf
    ProcedureReturn PTime.f
  Else
    ProcedureReturn 0
  EndIf
EndProcedure
If Ping ()
   Debug "Starte Telnet"
Else
  Debug "Keine Chance IP gibt es nicht"
EndIf
Das Problem ist folgendes, wenn man sich selbst anpingt oder ganz schnell ist, dann ist die Pingzeit kleiner 1ms.
Das hat zur Folge, dass die Prozedur 2 mal 0 als Ergebnis liefert.
Ich habe nun bei erfolgreichem Ping einfach den Minimalwert auf 1ms angehoben.
Nun sollte es Kugelsicher sein.
Viel Spaß damit.

BYe André
Wer Rechtschreibfehler findet darf sie ruhig behalten, ich brauche sie nicht mehr, ich habe noch genug davon.
BildBildBild
Antworten