Netzwerk frage

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
tft
Beiträge: 560
Registriert: 08.09.2004 20:18
Computerausstattung: GTX Titan , i9 9900K , 32 GB Ram , 500 GB SSD , 3 ASUS FullHD Monitore and more
Wohnort: Dachsen
Kontaktdaten:

Netzwerk frage

Beitrag von tft »

Hallo

mich treibt gerade die Sache mit dem Netzwerk um. Dazu habe ich nachstehenden Server Code geschrieben.
Vor dem einstig in die Main Schleife

Code: Alles auswählen

Define Netzwerk = CreateNetworkServer(#PB_Any, 6000 ,#PB_Network_TCP , "127.0.0.1" ) 
If Netzwerk : Debug "Server geöffnet" : EndIf 
Define NetzwerkEvent
Define *MemoryID = AllocateMemory(1024+4) 
Define *MemoryIDString = AllocateMemory(1024+4)
Define  result, Verbindung, DatenString.s, ClientNr
und in der Main Schleife.

Code: Alles auswählen

 
 NetzwerkEvent = NetworkServerEvent(Netzwerk)
  If NetzwerkEvent = #PB_NetworkEvent_Data 
    Verbindung = EventClient()
    result = 1024
    While result = 1024
      result = ReceiveNetworkData(Verbindung, *MemoryID, 1024)
      DatenString.s = PeekS(*MemoryID,result,#PB_Ascii )
      Debug DatenString.s
    Wend    
  ElseIf  #PB_NetworkEvent_Connect ; kommt ständig. Obwohl eigentlich kein Event kommen sollte
    i = EventClient()
    If i>0 And i <> ClientNr
      ClientNr = i
      Debug "Ein Client hat sich angemeldet"  
    EndIf
  ElseIf  #PB_NetworkEvent_Disconnect ; Kommt nicht, Wenn die Verbindung von alleine unterbricht.
    Debug "Der Client ist weg"
  EndIf  
Ich prüfe damit auf eine Ping Nachricht. Funktioniert auch. Aber das ist nicht so wie ich das erwartet habe.
Das Event #PB_NetworkEvent_Connect kommt ständig. Und #PB_NetworkEvent_Disconnect nie. Auch nicht wenn ich den Client
ordentlich mit dem CloseNetworkConnection(Verbindung) beände. Hier noch das Client Programm. Es ist ja nicht so das
das nicht anders geregelt werden könnte. Aber die Hilfe sagt da auch nichts anderes. Daher erwarte ich natürlich
das es funktioniert. Es ist aber möglich das ich ein Kreutz in meinen Neuronen habe. Wenn das bischen Code
nicht so funktioniert ...... dan wundert es mich nicht warum die Sprache nicht so eine Verbreitung findet. Aber dafür gibts ja
meine Videos.

Code: Alles auswählen

InitNetwork()

OpenWindow(0,0,0,200,200,"Client") 

Verbindung = OpenNetworkConnection("127.0.0.1", 6000 ,#PB_Network_TCP , 10000 ,"127.0.0.1")
If Verbindung
  
  *MemoryID = AllocateMemory(1024+4) 
  SendeTimer.q = ElapsedMilliseconds() +1000
  
  Repeat
    
    NetzwerkEvent = NetworkClientEvent(Verbindung) 
    
    If NetzwerkEvent > 0
      
    EndIf
    
    If SendeTimer < ElapsedMilliseconds()
      SendeTimer.q = ElapsedMilliseconds() +16
      SendNetworkString(Verbindung, "[PING]" ,#PB_Ascii  )
    EndIf
    
    Event = WindowEvent() 
    
    If Event  > 0  
      Select Event 
        Case #PB_Event_CloseWindow 
          Exit = 1 
      EndSelect 
    EndIf
    
    Delay(1)
    
  Until Exit = 1 
  CloseNetworkConnection(Verbindung)
EndIf

End
Wie immer bin ich um jede Erleuchtung froh.

Gruss TFT

Ach ja. PC mit W10 : PB Demo :
TFT

W10 , i9 9900K ,32 GB Ram , GTX Titan , 3 Monitore FHD
ARDUINO Freak :-)
Benutzeravatar
TroaX
Beiträge: 524
Registriert: 08.03.2013 14:27
Wohnort: ERB

Re: Netzwerk frage

Beitrag von TroaX »

Deine ElseIf Vergleiche sind unvollständig. Du solltest die Vergleiche immer ausformulieren. Wenn du:

Code: Alles auswählen

ElseIf  #PB_NetworkEvent_Connect
schreibst, ist das Ergebnis zwangsläufig immer #True, weil sich hinter der Event-Konstante eine Ganzzahl größer 0 verbirgt. Du musst bei ElseIf den kompletten Vergleich ausformulieren:

Code: Alles auswählen

ElseIf NetzwerkEvent = #PB_NetworkEvent_Connect
Es ist eben kein Switch-Statement. ElseIf ermittelt nur, ob der nachfolgende Ausdruck #True oder #False ist. Da dein Ausdruck aber nur aus einer Konstante besteht, welche eine positive Ganzzahl größer 0 enthält, ist dies zwangsläufig immer #True. Der Ausdruck sollte also einen vollständig ausformulierten Vergleich enthalten.
PC: AMD Ryzen 9 3950X | 64 GB RAM | RTX 3060 TI | 2,5 TB NVMe SSD | 2 TB SATA SSD | WIN 10 | 3x FHD Display
Mobil: AMD Ryzen 7 4800H | 16 GB RAM | GTX 1650 TI | 1 TB NVMe SSD | Win 10
Server: MSI Cubi N | Pentium Silver N5000 | 8 GB RAM | 1 TB HDD | Debian/Yunohost + Nextcloud
Programmierung: PureBasic | B4J | B4A | PHP | Python
Benutzeravatar
tft
Beiträge: 560
Registriert: 08.09.2004 20:18
Computerausstattung: GTX Titan , i9 9900K , 32 GB Ram , 500 GB SSD , 3 ASUS FullHD Monitore and more
Wohnort: Dachsen
Kontaktdaten:

Re: Netzwerk frage

Beitrag von tft »

ooo man. ich habe in letzter Zeit so fiel mit Select gearbeitet. Manchmal sieht man den Walt vor lauter Bäumen nicht. Danke für den Hinweis.

Gruss TFT

Code: Alles auswählen

  
  
  NetzwerkEvent = NetworkServerEvent(Netzwerk)
  If NetzwerkEvent <> 0
    Select NetzwerkEvent 
      Case #PB_NetworkEvent_Data 
        Verbindung = EventClient()
        result = 1024
        While result = 1024
          result = ReceiveNetworkData(Verbindung, *MemoryID, 1024)
          DatenString.s = PeekS(*MemoryID,result,#PB_Ascii )
          Debug DatenString.s
        Wend    
      Case #PB_NetworkEvent_Connect
        i = EventClient()
        If i>0 And i <> ClientNr
        ClientNr = i
          Debug "Ein Client hat sich angemeldet"  
        EndIf
      Case #PB_NetworkEvent_Disconnect 
        Debug "Der Client ist weg"
    EndSelect
  EndIf
PS: Meine PB DEMO Challenge macht mich echt fertig :-)
TFT

W10 , i9 9900K ,32 GB Ram , GTX Titan , 3 Monitore FHD
ARDUINO Freak :-)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 6826
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Netzwerk frage

Beitrag von STARGÅTE »

Kannst du den Sinn hinter "If i>0 And i <> ClientNr" erklären?
Laut Hilfe gibt es keine Einschränkungen des Rückgabewerts von EventClient().
Ein gütiger Werte kann also theoretisch auch 0, negativ oder ein Wert eines zuvor disconnecteten Clients sein.
PB 5.73 ― Win 10, 20H2 ― Ryzen 9 3900X ― Radeon RX 5600 XT ITX ― Vivaldi 4.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
tft
Beiträge: 560
Registriert: 08.09.2004 20:18
Computerausstattung: GTX Titan , i9 9900K , 32 GB Ram , 500 GB SSD , 3 ASUS FullHD Monitore and more
Wohnort: Dachsen
Kontaktdaten:

Re: Netzwerk frage

Beitrag von tft »

Das ist nur für die Debug Ausgabe gewesen. Damit eine Ausgabe nur bei Wechsel des Rückgabewertes stadtfindet. Da es sicher ist das nur
ein Client eine Verbindung aufnimmt. War das so OK. Das Rührt noch aus dem Moment. Wo ich die If Abfrage verpeilt habe. Und wird so nicht mehr benötigt.

Code: Alles auswählen

NetzwerkEvent = NetworkServerEvent(Netzwerk)
  If NetzwerkEvent <> 0
    Select NetzwerkEvent 
      Case #PB_NetworkEvent_Data 
        Verbindung = EventClient()
        result = 1024
        While result = 1024
          result = ReceiveNetworkData(Verbindung, *MemoryID, 1024)
          DatenString.s = PeekS(*MemoryID,result,#PB_Ascii )
          Debug DatenString.s
        Wend    
      Case #PB_NetworkEvent_Connect ; kommt ständig. Obwohl eigentlich kein Event kommen sollte
        Debug "Ein Client hat sich angemeldet"
      Case #PB_NetworkEvent_Disconnect ; Kommt nicht, Wenn die Verbindung von alleine unterbricht.
        Debug "Der Client ist weg"
    EndSelect
  EndIf
TFT

W10 , i9 9900K ,32 GB Ram , GTX Titan , 3 Monitore FHD
ARDUINO Freak :-)
Antworten