Prüfen ob 2.Netzwerkkabel eingesteckt ist

Anfängerfragen zum Programmieren mit PureBasic.
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ich hab hier was schönes für diiiiich. :lol:

Das Programm macht wie ich gesagt habe, einen Server auf und verbindet zu sich selbst und sendet sich selbst eine Zufallszahl zu. Diese Zufallszahl ist programmweit festgelegt, d. h. das Programm kann feststellen, ob die eingehende Verbindung auch von sich selbst stammt.

Wenn ja: grünes Licht, wenn wenn keine Verbindung mehr reinkommt, rotes Licht.
Wenn eine Verbindung eingeht, aber nicht die erwartete Zahl gesendet wird, wird angenommen, dass sich jemand fremdes verbunden hat, der wird dann rausgeschmissen.

Viel Spaß damit. Hoffe, du darfst jetzt 1 Stunde früher aus der Sonne. <)

Code: Alles auswählen

EnableExplicit

Enumeration 
	#server
	#fenster
	#ipadresse
	#statusfarbe
	#statustext
	#sound
	#sticky
EndEnumeration

If Not InitNetwork() ; Netzwerk prüfen
	MessageRequester("Modem Indikator", "Problem: Netzwerk ist nicht verfügbar!", #MB_ICONERROR)
	End
EndIf
If Not CreateNetworkServer(#server, 4097, #PB_Network_UDP) ; Server erstellen
	MessageRequester("Modem Indikator", "Problem: Server könnte nicht geöffnet werden!", #MB_ICONERROR)
	End
EndIf

Procedure status(status)
	Static statusAlt=-1, timeout ; Sound kommt nur max. alle 2 Sek. egal wie schnell diese Procedure aufgerufen wird
	If status <> statusAlt
		If status
			SetGadgetColor(#statusfarbe, #PB_Gadget_BackColor, #Green)
			SetGadgetText(#statustext, "Verbunden")
			If GetGadgetState(#sound) And ElapsedMilliseconds() > timeout
				MessageBeep_(#MB_ICONINFORMATION)
			EndIf
		Else
			SetGadgetColor(#statusfarbe, #PB_Gadget_BackColor, #Red)
			SetGadgetText(#statustext, "Nicht verbunden")
			If GetGadgetState(#sound) And ElapsedMilliseconds() > timeout
				MessageBeep_(#MB_ICONSTOP)
			EndIf
		EndIf
		timeout=ElapsedMilliseconds()+2000
		statusAlt=status
	EndIf
EndProcedure


OpenWindow(#fenster, #PB_Ignore, #PB_Ignore, 330, 140, "Modem Indikator", #PB_Window_MaximizeGadget|#PB_Window_ScreenCentered)
CreateGadgetList(WindowID(#fenster))
	TextGadget(#PB_Any, 5, 10, 115, 15, "Diese IP prüfen:")
	IPAddressGadget(#ipadresse, 120, 5, 200, 20)
		SetGadgetState(#ipadresse, MakeIPAddress(192, 168, 2, 2))
	Frame3DGadget(#PB_Any, 5, 35, 320, 60, "Status:", #PB_Frame3D_Single)
	ContainerGadget(#statusfarbe, 40, 50, 30, 30, #PB_Container_Raised)
		CloseGadgetList()
	TextGadget(#statustext, 75, 60, 150, 20, "Noch nicht getestet")
	CheckBoxGadget(#sound, 5, 100, 200, 15, "Akustisches Signal")
		SetGadgetState(#sound, 1)
	CheckBoxGadget(#sticky, 5, 120, 200, 15, "Fenster immer im Vordergrund")

Define timeoutClient, timeoutServer, verbunden, verbundenAlt=-1, zahl=Random(1<<31), *buffer=AllocateMemory(SizeOf(Long))

Repeat
	Select WaitWindowEvent(100)
		Case #PB_Event_CloseWindow
			Break
	EndSelect
	
	If ElapsedMilliseconds() > timeoutClient
		Define connection=OpenNetworkConnection(GetGadgetText(#ipadresse), 4097, #PB_Network_UDP)
		If connection
			SendNetworkData(connection, @zahl, SizeOf(long))
			CloseNetworkConnection(connection)
		EndIf
		timeoutClient=ElapsedMilliseconds()+100
	EndIf
	
	If ElapsedMilliseconds() > timeoutServer
		verbunden=0
		While NetworkServerEvent() = #PB_NetworkEvent_Data
			ReceiveNetworkData(EventClient(), *buffer, SizeOf(Long))
			If PeekL(*buffer) = zahl
				PokeL(*buffer, 0)
				verbunden=1
			Else
				CloseNetworkConnection(EventClient())
			EndIf
			Delay(1)
		Wend
		If verbunden <> verbundenAlt
			status(verbunden)
			verbunden=verbundenAlt
		EndIf
		timeoutServer=ElapsedMilliseconds()+300
	EndIf
		
	
	StickyWindow(#fenster, GetGadgetState(#sticky))
ForEver

End
Bis auf den Sound alles ohne API; notfalls kann man die Sache mit dem SOund auch komplett rausnehmen, dann ist es 100% ohne API.

Bitte poste Feedback und evtl. vorhandene Fragen zum Code! :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 »

Hi AND51,

und vielen Dank für deine mühe!
Schnell ist der Code auf jedenfall. :D
Bekomme jedoch nie eine Verbindung. Wofür ist der Port 4097? Ich habe in meinen ersten versuchen immer den Port 80 genutzt .
PB 4.02
iron2006
Beiträge: 20
Registriert: 21.10.2006 04:23

Beitrag von iron2006 »

So habe es zwar noch nicht hinbekommen das er mir die Verbindung anzeigt mach aber jetzt trotzdem Feierabend.

Vielleicht ja morgen?
PB 4.02
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

> Schnell ist der Code auf jedenfall.
Das liegt daran, dass ich UDP statt TCP benutze...
UDP sendet sozusagen einfach drauf los, das ist der Vorteil gegenüber TCP; TCP wird nämlich standardmäßig benutzt, wenn man keine Parameter angibt. So wie du in deinem Ausgangscode.
Kann TCP keine Verbindung herstellen, versucht er es nochmal, manchmal bis zu 30 Sekunden lang. Deswegen war dein Code auch so -mit Verlaub- lahmarschig.

> Bekomme jedoch nie eine Verbindung.
Ich muss gestehen, ich habe es nur mit meiner Netzwerkkarte probiert und diese auch nie abgenommen, sondern immer über einen extra Button eine aktive/inaktive Verbindung vorgetäuscht.
Schreib doch mal noch mehr dazu!

> Wofür ist der Port 4097?
Na, man braucht doch einen Port, zu dem sich das Programm verbindet; ich nehm meistens 4097, kann ich mir gut merken. Wenn du den ändern möchtest - gern; dann aber bitte überall im Programm.

> Ich habe in meinen ersten versuchen immer den Port 80 genutzt
Kannst du gerne - siehe Anweisung einen Absatz vorher. Ich wollte einen möglichst unbenutzen Port nehmen, sodass man z. B. nebenher noch einen Webserver an Port 80 laufen lassen kann.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag von a14xerus »

AND51 hat geschrieben: Ich muss gestehen, ich habe es nur mit meiner Netzwerkkarte probiert
hast du die ip deiner netzwerkkarte eingegeben????

wenn ja dann ist es nämlich deine lan-ip und du hast deinem eigenen prog (wie als wenn du 127.0.0.1 eingetippt hättest) eine event gesendet....
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ja, ich habe meine LAN IP 192.168.2.2 eingegeben; ich weiß nicht was du meinst. Was für ein Event habe ich an mein eigenes Programm gesendet?

Ich habe es nocheinmal explizit mit 127.0.0.1 probiert:

Kein Unterschied - alles funktioniert, wie es soll.

Ändere Zeile 65 in

Code: Alles auswählen

	If ElapsedMilliseconds() > timeoutClient And GetGadgetState(#sticky)
und es wird nur gesendet, wenn das Fenster immer im Vordergrund ist. SO brauche ich nicht immer mein Netzwerkkabel rausziehen... :lol:
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

RAAAAAAAAAAAAAAH, wieso sendet er nicht?

Kein Bock, alles neu zu schreiben, also Kurzversion:

1. Stecker ziehen+LAN IP eingeben
Er zeigte bei mir weiterhin verbunden an. Habe aber wahrscheinlich nicht lang genug gewartet, sondern ihn gleih wieder reingesteckt (Pfui, wer jetzt was denkt ^^ )

2. Code-Modifikation (Zeile 65)+LAN IP eingeben
Ändert man Zeile 65 wie angegeben, funktioniert es: Er sendet dann nur noch, wenn man ein Häkchen bei "Vordergrund" setzt.

3. Firewall-Blockade+LAN IP eingeben
Die Netzwerkbloacke meiner Firewall unterbindet sämtliche Netzwerkaktivitäten, auch die nach 127.0.0.1. Blockade an: Rot. Aus: Grün.


Mein Programm achtet nicht auf das erfolgreiche Senden, sondern erkennt am Empfang, ob die Verbindung steht, oder nicht. also ist es egal, ob man 127.0.0.1 oder 129.168.2.2 eingibt. Sende ich an eine Timbuktu-Adresse 169.254.93.1, dann landen die gesendeten Pakete im Nirvana.

Folge: Er empfängt nicht mehr und sieht darauf hin rot. Funzt doch also korrekt, oder?
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
a14xerus
Beiträge: 1440
Registriert: 14.12.2005 15:51
Wohnort: Aachen

Beitrag von a14xerus »

nein weil das empfangen geht doch nur wenn man halt an sich selber sendet..
entweder durch 127.0.0.1 oder die netzwerkkarten-ip ( eigene ip)
sendet man an ein modem, und dieses ist zwar angeschlossen, aber antwortet nicht, passiert auch nichts.

modem <> netzwerkkarte
Benutzeravatar
AND51
Beiträge: 5220
Registriert: 01.10.2005 13:15

Beitrag von AND51 »

Ah, ich glaub, ich habs verstanden. Wenn das so ist, dann hatte ich einen Denkfehler.

OK, dann kann man das Programm unter Umständen doch benutzen:
Man teilt das Programm auf in Sender und Empfänger und lässt die zu sendenden Datenpakete das Modem passieren.
Der Sender befindet sich also außerhalb des PCs, am besten im LAN. Dann sendet der Sender an 192.168.100.1, wo der Empfänger an einem Port wartet. Fertig.
PB 4.30

Code: Alles auswählen

Macro Happy
 ;-)
EndMacro

Happy End
Antworten