Prüfen ob 2.Netzwerkkabel eingesteckt ist

Anfängerfragen zum Programmieren mit PureBasic.
iron2006
Beiträge: 20
Registriert: 21.10.2006 04:23

Prüfen ob 2.Netzwerkkabel eingesteckt ist

Beitrag von iron2006 »

Hi,

ich habe hier einen Rechner mit 2. Netzwerkkarten die erste dient zur kontaktaufnahme mit einem Server über die 2. werden Kabelmodem´s getestet. Das Programm zum testen wird über einen kleinen Button gestarten.
Mein Ziel ist es nun aber das der Test automatisch gestartet wird sobald das Netzwerkkabel eingesteckt wird.
Mein Code bisher funktioniert, ist aber leider zu träge.

Code: Alles auswählen

InitNetwork()
x=1
Repeat
Delay(15) 
If (OpenNetworkConnection("192.168.100.1",80))<>0 
If x=1
;MessageRequester("Info","Test wird gestartet",0)
RunProgram("c:\AutoMODEM.exe", "", "")
 EndIf
 x=0
Else
x=1
EndIf 
ForEver
End
Der Test muss sofort gestartet werden sobald das Kabel eingesteckt wird . Nun habe ich diesen Code-schnipsel gefunden der aber leider nur bei einer Netzwerkkarte funktioniert.

Code: Alles auswählen

Connected.l 
SenseAPI.l=OpenLibrary(0,"sensapi.dll") 
FuncID.l=GetFunction(0,"IsNetworkAlive") 
If CallCFunctionFast(FuncID,@Connected) 
  Debug "Kabel ist dran" 
Else 
  Debug "Kabel fehlt" 
EndIf 
CloseLibrary(0) 
Hat hier vielleicht jemand eine Idee? An diesem Rechner werden jeden Tag viele 100 Modem´s getestet daher wäre es schön wenn man das ganze automatisieren könnte.


[/code]
PB 4.02
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Versuch das hier mal:

Code: Alles auswählen

Define IP.s, SensAPI.l, *FuncID
SensAPI = OpenLibrary(#PB_Any, "sensapi.dll")
*FuncID = GetFunction(SensAPI, "IsDestinationReachable")

IP = "192.168.100.1"
If CallCFunctionFast(*FuncID, @IP, 0)
  Debug "Kabel ist dran"
Else
  Debug "Kabel fehlt"
EndIf
CloseLibrary(SensAPI)
Das ist der andere Befehl aus der 'sensapi.dll', der allerdings in Vista (noch)
nicht implementiert ist.

http://msdn.microsoft.com/en-us/library ... S.85).aspx
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Re: Prüfen ob 2.Netzwerkkabel eingesteckt ist

Beitrag von AND51 »

iron2006 hat geschrieben:über die 2. werden Kabelmodem´s getestet.
Welche IP haben die Modems denn? immer dieselbe? Oder fangen sie wenigstens auf jeden Fall mit 192.168.x.x an?

Wenn ja, probier mal ExamineIPAdresses(), geh alle IPs durch.
Zähl einfach mit, wie viele IPs gefunden werden und ggf, ob sie mit 192.168.x.x anfangen. Ist nur ne Idee... :)
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
iron2006
Beiträge: 20
Registriert: 21.10.2006 04:23

Beitrag von iron2006 »

Hallo und danke für die antworten,

bei dem Code oben bekomm ich leider einen Error:
"invalid memory access" Zeile 6
Betriebssystem ist XP!

Ja die KabelModem´s haben immer die IP 192.168.100.1 über diese werden Sie später beim Kunden auch angesprochen.

@Nicthe....
Hast du vielleicht noch eine Idee.

Gruß Iron2006
PB 4.02
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

iron2006 hat geschrieben:Ja die KabelModem´s haben immer die IP 192.168.100.1
Das heißt, mein Lösungsansatz wäre nicht geeignet :?:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
iron2006
Beiträge: 20
Registriert: 21.10.2006 04:23

Beitrag von iron2006 »

@AND51
doch es funktioniert ja, aber diese methode ist zu träge.

Der Test sollte schon direkt nach dem einstecken des Netzwerkkabels starten.
Sobald im Systray die meldung kommt verbindung wird hergestellt.

Mit der sensapi.dll funktioniert das sehr gut, aber eben nur bei einer Netzwerkkarte.

@NicTheQuick

Der Code funtioniert doch, habe nur:
IsDestinationReachableA (ANSI) eingefügt.

Die meldung Kabel drin oder draussen kommt aber leider auch viel zu spät!

Gibt es eine möglichkeit dieses Event der 2. LAN verbindung auszuwerten wenn er meldet das die verbindung hergestellt wird?
PB 4.02
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Dann machs mal so:
Dein Testprogramm macht einen Server auf mit CreateNetworkServer().

In einem Thread führst du dann in einer Schleife immer folgenden Befehl aus:

Code: Alles auswählen

Repeat
   OpenNetworkConnection(0, "192.168.100.1", #PB_Network_UDP)
   If SendNetworkString(0, "Test")
      Debug "Modem online!"
   EndIf
   CloseNetworkConnection(0)
   Delay(1000)
ForEver
Benutz aber UDP, denn bei TCP haste sonst einen sehr langen Timeout. Bei UDP wird immer eine Verbindung hergestellt; selbst, wenn das iel offline ist, kannst du die Senden-Befehle benuzten.
Sieh dir die Rückgabewerte an, ob etwas erfolgreich gesendet werden konnte.

Falls die Rückgabewerte besagen, dass erfolgreich gesendet wurde, obwohl kein Moden angeschlossen ist, musst du eben nicht nur einen Server aufmachen, sondern auch ständig mit EventNetworkServer() nach eingehenden Daten Aussschau halten.

Verstanden? :allright:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
iron2006
Beiträge: 20
Registriert: 21.10.2006 04:23

Beitrag von iron2006 »

Verstanden?
Das wird sich morgen zeigen, bin ja Anfänger und beschäftige mich leider viel zu selten mit PB. Dieses Problem beschäftigt mich aber schon recht lange und so langsam werden meine Kollegen hier unruhig. Egal für heute ist Feierabend und ich will noch 1. Stunde in die Sonne. <) Vielen Dank für die Hilfe, werde morgen berichten ob das klappt.
PB 4.02
iron2006
Beiträge: 20
Registriert: 21.10.2006 04:23

Beitrag von iron2006 »

Hi,

leider komme ich mit den Netzwerk-Befehlen nicht klar. :cry: Bezweifel auch das, das schnell genug wäre. Ich hoffe immer noch den Event auszuwerten wenn die Verbindung dabei ist hergestellt zu werden.
Na ja ich test das mal weiter hier und wenn einer von euch nicht in der Sonne liegt und eine Idee hat, ich bin hier noch 4 Stunden gefangen. :wink: Gruß Iron2006
PB 4.02
Benutzeravatar
NicTheQuick
Ein Admin
Beiträge: 8808
Registriert: 29.08.2004 20:20
Computerausstattung: Ryzen 7 5800X, 64 GB DDR4-3200
Ubuntu 24.04.2 LTS
GeForce RTX 3080 Ti
Wohnort: Saarbrücken

Beitrag von NicTheQuick »

Vielleicht kommt man an den Event aber auch gar nicht ran, weil da der
Anschluss sozusagen ja erst initialisiert wird. Die IP-Adresse werden ja auch
erst am Ende des Verbindungsversuchs vergeben, damit du mit dem Gerät
kommunizieren kannst.
Antworten