CreateNetworkServer() ab PB 6.10

Für allgemeine Fragen zur Programmierung mit PureBasic.
jogo
Beiträge: 120
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint und LMDE

CreateNetworkServer() ab PB 6.10

Beitrag von jogo »

Moin zusammen,

bis PB 6.04 funktioniert die Funktion CreateNetworkServer() wie in der Hilfe beschrieben.
Sie liefert beim Versuch, einen Server auf einem bereits belegten Port zu erstellen den Wert 0, sonst einen Wert >0.
Ab PB 6.10 ist der Rückgabewert immer > 0, egal wie oft ich einen Server mit dem selben Port erzeuge. Möglicherweise wird kein gar kein Server erstellt, aber die Funktion liefert immer einen Erfolg (also >0)
Folgendes Testprogramm demonstriert den Unterschied zwischen PB 6.04 und PB > 6.04:

Code: Alles auswählen

 EnableExplicit 
ExamineDesktops()           ;anzahl der desktops ermitteln

Global.i wx,wy,ev
Global.s ft,nz


Procedure chk_ins()
  ;initialisert einen netwerkserver, und prüft, ob auf diesem port bereits ein server läuft
  ;wenn ja, probiere ich den nächsten port
  Protected po.i = 6107,l.i,e.i
  
  Repeat   ;schleife für servererstellung und um ggf. einen port nach dem anderen zu testen
    po + 1 ;portnr. erhöhen
    l+1    ; instanzzähler    
    e = CreateNetworkServer(0, po,#PB_Network_UDP,"127.0.0.1") ;server starten und rückgabe in e
    MessageRequester("Rückgabe","Versuch "+l+":  "+Str(e)) ;testausgabe
    If e ;wenn mit aktuellen port ein server gestartet wurde   
      nz = Str(l)                 ;instanz-nr. an globale stringvariable      
    ElseIf  l>8                   ;wenn nach dem 9.versuch kein server erstellt werden konnte
      e = 1                       ;flag zum verlassen setzen
      nz = "?"                    ;instanzanzeige setzen, damit zu sehen ist, das zu viele Instanzen offen sind oder serverstart fehlgeschlagen ist
    EndIf    
  Until e > 0 
  
  If l > 1 ;wenn mehr als eine instanz gestartet wird
    wx + (l*20) - 20 ;xposition ein paar pixel erhöhen, damit das neue Fenster nicht genau über den zuvor gestarteten fenster klebt
    wy + (l*20) - 20 ;yposition wie x position
    ResizeWindow(0,wx,wy,#PB_Ignore, #PB_Ignore) ;neue fensterposition herstellen
  EndIf
EndProcedure

;------------------------------------------------------------------------------------
ft = "Server"                  ;fenstertitel
wx = DesktopWidth(0) / 2 - 110 ;horizental zentrieren
wy = DesktopHeight(0) /2 - 200 ;vertikal etwas über dem zentrum platzieren

OpenWindow(0, wx, wy, 225, 110,ft,#PB_Window_MinimizeGadget)
StickyWindow(0,#True) ;fenster fest im vordergrund

CompilerIf #PB_Compiler_Version < 600 ;wenn compilerversion unter 6.00 - also initnetwork() noch unterstützt wird
  If InitNetwork()                    ;netzwerkfunktion initialisieren
    chk_ins()                         ; lokalen server starten und instanzen checken     
  EndIf                               
CompilerElse                          ;wenn compiler 6.00 und höher - also initnetwork() nicht mehr unterstützt wird
  chk_ins()                           ; lokalen server starten und instanzen checken  
CompilerEndIf
SetWindowTitle(0,ft+" ["+nz+"]")  ;fenstertitel mit der ermittelten instanz beschriften

Repeat ;ereignisschleife
  ev = WaitWindowEvent()    
  Select ev                 
    Case #PB_Event_CloseWindow      
      Break                 
  EndSelect               
ForEver   
Kann mir nicht vorstellen, dass dies ein Bug ist, möglicherweise wird das ab 6.10 anders gebaut, ist aber in der Hilfe nicht beschrieben (vermute ich)

EDIT: um die Wirkung zu sehen, muß das obige Programm mehrmals gestartet werden, so dass mehrere Instanzen laufen. Wenn ein laufender Server erkannt wird, wird die neue Instanz mit einer neuen Port-Nummer gestartet und die Fenster im Titel durchnummeriert.
--
Ideen gibt es viele - man muss sie nur haben...
Mint / LMDE5+6 // PureBasic 6.21
DePe
Beiträge: 194
Registriert: 26.11.2017 16:17

Re: CreateNetworkServer() ab PB 6.10

Beitrag von DePe »

Hallo jogo,

mit PB v6.10/11 x64 und Windows 7 x64 funktioniert dein Programm hier richtig.

Peter
Benutzeravatar
tft
Beiträge: 650
Registriert: 08.09.2004 20:18
Computerausstattung: GFX 3060 Ti , i7 12700F , 32 GB Ram , 900 GB SSD , TV
Wohnort: Dachsen
Kontaktdaten:

Re: CreateNetworkServer() ab PB 6.10

Beitrag von tft »

Hallo.

Am besten ist es. Sich die Dinge zu visualisieren. Natürlich ist das kein Bug. Sondern ein Mittverständniss der Funktionsweise.

1. Mach eine Console auf, und lass dir das mit PrintN() ausgeben
2. Wenn du einen Server öffnest. Braucht er eine Nummer oder du nimmst #PB_Any
3. Gib dir die Infos aus.

Code: Alles auswählen

 EnableExplicit 
ExamineDesktops()           ;anzahl der desktops ermitteln

Global.i wx,wy,ev
Global.s ft,nz

OpenConsole()
Procedure chk_ins()
  ;initialisert einen netwerkserver, und prüft, ob auf diesem port bereits ein server läuft
  ;wenn ja, probiere ich den nächsten port
  Protected po.i = 6107,l.i,e.i,e1.i
  
  Repeat   ;schleife für servererstellung und um ggf. einen port nach dem anderen zu testen
    po + 1 ;portnr. erhöhen
    l+1    ; instanzzähler    
    e = CreateNetworkServer(l, po,#PB_Network_UDP,"127.0.0.1") ;server starten und rückgabe in e
    MessageRequester("Rückgabe","Versuch "+l+":  "+Str(e)) ;testausgabe
    If e ;wenn mit aktuellen port ein server gestartet wurde   
      nz = Str(l)                 ;instanz-nr. an globale stringvariable      
    ElseIf  l>8                   ;wenn nach dem 9.versuch kein server erstellt werden konnte
      e1 = 1                       ;flag zum verlassen setzen
      nz = "?"                    ;instanzanzeige setzen, damit zu sehen ist, das zu viele Instanzen offen sind oder serverstart fehlgeschlagen ist
    EndIf  
    PrintN(" Handler vom Server "+e)
  Until e1 > 0 
  
  If l > 1 ;wenn mehr als eine instanz gestartet wird
    wx + (l*20) - 20 ;xposition ein paar pixel erhöhen, damit das neue Fenster nicht genau über den zuvor gestarteten fenster klebt
    wy + (l*20) - 20 ;yposition wie x position
    ResizeWindow(0,wx,wy,#PB_Ignore, #PB_Ignore) ;neue fensterposition herstellen
  EndIf
EndProcedure

;------------------------------------------------------------------------------------
ft = "Server"                  ;fenstertitel
wx = DesktopWidth(0) / 2 - 110 ;horizental zentrieren
wy = DesktopHeight(0) /2 - 200 ;vertikal etwas über dem zentrum platzieren

OpenWindow(0, wx, wy, 225, 110,ft,#PB_Window_MinimizeGadget)
StickyWindow(0,#True) ;fenster fest im vordergrund

CompilerIf #PB_Compiler_Version < 600 ;wenn compilerversion unter 6.00 - also initnetwork() noch unterstützt wird
  If InitNetwork()                    ;netzwerkfunktion initialisieren
    chk_ins()                         ; lokalen server starten und instanzen checken     
  EndIf                               
CompilerElse                          ;wenn compiler 6.00 und höher - also initnetwork() nicht mehr unterstützt wird
  chk_ins()                           ; lokalen server starten und instanzen checken  
CompilerEndIf

SetWindowTitle(0,ft+" ["+nz+"]")  ;fenstertitel mit der ermittelten instanz beschriften

Repeat ;ereignisschleife
  ev = WaitWindowEvent()    
  Select ev                 
    Case #PB_Event_CloseWindow      
      Break                 
  EndSelect               
ForEver  

CloseConsole()
Wenn du Hilfe brauchst. Hier gerne umsonst. Ansonsten gebe ich auch Nachhilfe für interessierte von 10 bis 100 Jahre. Via DISCORD oder Zoom, Skype geht auch, ab 20.00 : 45 Minuten = 5 Euro, PureBasic to go, an mich, wenn du Interesse hast. Es macht es einfacher, jemanden zu haben, den man direkt ansprechen kann.

Gruss TFT
TFT seid 1989 , Turgut Frank Temucin , CH-Dachsen/DE-Berlin/TR-Antalya
Mein Projekt (Driving School Evergarden)
Codes bei (GitHub) Videos von (YouTube)
Treffen via Discord: Einladung

PB 6.10 | W11 | i7 12700F | 32 GB Ram | RTX 3060 Ti | 60 Herz -TV FullHD
ARDUINO Freak | Sprecher | Game Dev. | Geschichten Erzähler :-)
jogo
Beiträge: 120
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint und LMDE

Re: CreateNetworkServer() ab PB 6.10

Beitrag von jogo »

danke für die Reaktionen.
Also beim 1. Start wird ja sofort ein Server erstellt und das Fenster hat die Nr. [1]
Wird das Programm ein weiteres Mal gestartet (also ohne das 1. zu schließen), erkennt chk_ins(), das der Startport bereits belegt ist und probiert den nächsten Port (zähl ich also hoch). Wenn dieser frei ist, gelingt ja der Serverstart und ich nummeriere das Fenster mit [2] usw.
Bei 8 Instanzen habe ich dann eine Begrenzung eingebaut.
Bis Vers. 604 funktioniert das auch so. Alle anderen Vers. danach geben beliebig oft auf dem selben Port ein Handle zurück.
Auf Windows hab ich das jetzt nicht geprobt. Hab vergessen zu erwähnen, das ich das auf Linux machen (Mint 21/22 bzw. LMDE 12) - Sorry..
--
Ideen gibt es viele - man muss sie nur haben...
Mint / LMDE5+6 // PureBasic 6.21
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: CreateNetworkServer() ab PB 6.10

Beitrag von HeX0R »

Scheint mir ein Bug bei Linux zu sein, tatsächlich wird der erste Server dann offensichtlich einfach ignoriert:

Code: Alles auswählen

SID1 = CreateNetworkServer(0, 12345, #PB_Network_UDP, "127.0.0.1")
SID2 = CreateNetworkServer(1, 12345, #PB_Network_UDP, "127.0.0.1")
Debug "SID1: " + Str(SID1) + ", SID2: " + Str(SID2)
CID = OpenNetworkConnection("127.0.0.1", 12345, #PB_Network_UDP)
If CID
	SendNetworkString(CID, "bla bla bla")
	t = ElapsedMilliseconds() + 2000
	Repeat
		Select NetworkServerEvent(SID1)
			Case #PB_NetworkEvent_None
				Delay(3)
			Case #PB_NetworkEvent_Data
				Debug "Data on Server #1 received"
		EndSelect
		
		Select NetworkServerEvent(SID2)
			Case #PB_NetworkEvent_None
				Delay(3)
			Case #PB_NetworkEvent_Data
				Debug "Data on Server #2 received"
		EndSelect
	Until t < ElapsedMilliseconds()
	CloseNetworkConnection(CID)
EndIf
Betrifft aber auch nur UDP
DePe
Beiträge: 194
Registriert: 26.11.2017 16:17

Re: CreateNetworkServer() ab PB 6.10

Beitrag von DePe »

Mit PB v6.11 x64 und Raspberry Pi OS 12 gibt es ebenfalls den Fehler.

Peter
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: CreateNetworkServer() ab PB 6.10

Beitrag von HeX0R »

Eigentlich erstaunlich, dass mein Beispielcode funktioniert, ich hätte eigentlich NetworkServerEvent(0) und NetworkServerEvent(1) nehmen müssen.
Da mich Linux aber nicht wirklich interessiert, darf gerne jemand anderes diesen Bug melden.
jogo
Beiträge: 120
Registriert: 22.11.2020 20:05
Computerausstattung: 'ne Handvoll gebrauchte Laptops & PCs mit Mint und LMDE

Re: CreateNetworkServer() ab PB 6.10

Beitrag von jogo »

Danke fürs probieren und den Hinweis mit UDP:)
hab das jetzt mal mit TCP geprobt. Dann klappt es, wie erwartet - zumindest das Erstellen des Servers und das Erkennen von bereits belegten Ports.

@HeX0R: in deinem Code funktionieren die IDs als auch die #Servernummern.
Und dann habe ich deinen Code mal um einen weiteren Server erweitert. Es wird dann der Datenempfang für den Server #3 gemeldet.
D.h., dass ein bestehender UDP Server auf dem selben Port einfach platt gemacht wird und somit immer der zuletzt erstellte Server die Daten empfängt.
Es bleibt also immer genau ein Server mit der zuletzt erstellten #Nr. oder ID. Eine Prüfung auf einen bestehenden Server wird also bei UDP nicht gemacht.
--
Ideen gibt es viele - man muss sie nur haben...
Mint / LMDE5+6 // PureBasic 6.21
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: CreateNetworkServer() ab PB 6.10

Beitrag von HeX0R »

jogo hat geschrieben: 11.06.2024 19:59 @HeX0R: in deinem Code funktionieren die IDs als auch die #Servernummern.
Richtig, das fand ich auch erstaunlich, scheint ein undokumentiertes Feature für Honks (also mich in diesem Fall) zu sein :mrgreen:
Benutzeravatar
mk-soft
Beiträge: 3852
Registriert: 24.11.2004 13:12
Wohnort: Germany

Re: CreateNetworkServer() ab PB 6.10

Beitrag von mk-soft »

Nur UDP:
Schließt man den zweiten Server geht wieder der erste Server.
Auch komisch ...

Sollte vielleicht doch mal als bug gemeldet werden.
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten