Problem mit ReceiveNetworkData - Bleibt beim Clienten hängen

Für allgemeine Fragen zur Programmierung mit PureBasic.
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Problem mit ReceiveNetworkData - Bleibt beim Clienten hängen

Beitrag von STARGÅTE »

Tachchen,

stunden lang wusste ich nicht warum mein Programm einfach Einfriert.
Erst dachte ich ich habe selber eine Endlosschleife programmiert.

Doch dann stieß ich auf folgendes Problem:

ReceiveNetworkData.
Und zwar bleibt es auf der ClientSeite (also mit einer güligen ConnectionID) einfach hängen wenn es keine Daten mehr zum auslesen gibt, anstatt wie beim Server (mit einem güligen EventClient()) eine -1 zurück zu geben

Kurzes Beispiel, ohne das Daten gesendet werden:

Code: Alles auswählen

InitNetwork()
Debug CreateNetworkServer(#PB_Any, 7000)
ConnectionID = OpenNetworkConnection("127.0.0.1", 7000)
Debug ConnectionID
Debug "---"
Long.l


NetworkServerEvent()
Debug ReceiveNetworkData(EventClient(), @Long, 4)

NetworkClientEvent(ConnectionID)
Debug ReceiveNetworkData(ConnectionID, @Long, 4)

Debug "Ende"

Hier noch ein Beispiel bei dem Daten gesendet werden:

Code: Alles auswählen

InitNetwork()


; Variante ; ServerEmpfang = 0 , ClientEmpfang = 1
#Variante = 1


; Buffer ; wenn er teiler von Datenlänge ist BUG bei ClientEmpfang, sonst OK
#Buffer = 8
*Buffer = AllocateMemory(32) 
 
 
 
CreateNetworkServer(1, 7000)
ConnectionID = OpenNetworkConnection("127.0.0.1", 7000)

Delay(100)

Select NetworkServerEvent()
 Case #PB_NetworkEvent_Connect
  ClientID = EventClient()
EndSelect

Quad.q = 12345678890
If #Variante
 SendNetworkData(ClientID, @Quad, 8)
 SendNetworkData(ClientID, @Quad, 8)
 ID = ConnectionID
Else
 SendNetworkData(ConnectionID, @Quad, 8)
 SendNetworkData(ConnectionID, @Quad, 8)
 ID = ClientID
EndIf

 

Repeat
 
 If #Variante
  Event = NetworkClientEvent(ID)
 Else
  Event = NetworkServerEvent()
 EndIf
 
 Select Event 

  Case #PB_NetworkEvent_Data
  
   Repeat
    Debug "ReceiveNetworkData START"
    Length = ReceiveNetworkData(ID, *Buffer+Shift, #Buffer)
    Debug "ReceiveNetworkData ENDE mit "+Str(Length)+" Bytes"
    If Length > 0 : Shift + Length : EndIf
   Until Length < #Buffer
 
   Debug PeekQ(*Buffer)
   Debug PeekQ(*Buffer+8)
   Quit = #True
 
 EndSelect
 
Until Quit

Debug "Beendet"
Beide Beispiel bleiben hängen bei ReceiveNetworkData!

Ändet bei beim 2. beispiel #Variante = 0 , so läuft es (weil es ja dann auf der Serverseite ist)
Ach wenn man den LeseBuffer so ändert das er nicht genau alles ausließt (zb #Buffer = 13 )

___

Kurz und knapp:
ReceiveNetworkData() bleibt bei einer gültigen ConnectionID hängen, wenn keine Daten mehr zum Empfangen bereit stehen, anstatt -1 zurückzugeben wie es beim Server der fall ist!
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
HeX0R
Beiträge: 3040
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: Problem mit ReceiveNetworkData - Bleibt beim Clienten hängen

Beitrag von HeX0R »

Jo, das macht es eigentlich seit Anbeginn der Zeit.

Dein 1. Beispiel ist eh ein sehr schlechtes Beispiel.
Genausowenig, wie du ohne zu wissen, ob ein #PB_Event_Gadget ansteht EventGadget() aufrufen darst, darfst du ReceiveNetworkBla aufrufen, wenn du nicht weisst, dass ein DATA-Event ansteht.

und auch das 2. ist kein gutes Beispiel.
Nur, wenn ReceiveNetworkData() die Länge des übergebenen Puffers zurück gibt, stehen noch weitere Daten an.
Es einfach zweimal aufzurufen macht auch kein normaler Mensch ;)
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Problem mit ReceiveNetworkData - Bleibt beim Clienten hängen

Beitrag von STARGÅTE »

beim 2. Beispiele lese ich aber auch nur weiter wenn es wirklich die Länge des Buffers zurück gibt.

Und wenn mein Buffer nun mal "blöderweise" so lang ist wie das was ankam, muss ich ja weiter lesen, weil es ja vllt noch mehr gibt, aber dann bleibt er hängen.

Vllt kann einer mal n besseres Beispiel entwerfen und dann bei BUGs posten.
____

aber ich habe nun eine umgehung des Bugs gefunden.

Eigentlich wollte ich ja immer erst 4 Bytes lesen (in denen die Länge des ankommenden Pakets steht) und dann diese länge auslesen.
Dabei würde es aber zu diesem Problem kommen wenn kein Paket mehr kommt.

LÖSUNG:
Ich lese bei jedem Paket absichtlich 4Byte mehr aus, falls ich dann als Rückgabe 4 Bytes zu wenig bekomme, gibt es kein neues Paket mehr. und wenn es doch wieder eine neue Länge gabm gibs auch weiter was zu lesen.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Benutzeravatar
tobe
Beiträge: 146
Registriert: 14.09.2006 17:33
Wohnort: Oktoberfest

Re: Problem mit ReceiveNetworkData - Bleibt beim Clienten hängen

Beitrag von tobe »

hallo,
ich hab mir das jetzt mal angekuckt und in dein 2tes beispiel einen check eingebaut, dann bleibt da bei mir nix mehr hängen

Code: Alles auswählen

InitNetwork()
; Variante ; ServerEmpfang = 0 , ClientEmpfang = 1
#Variante = 1
; Buffer ; wenn er teiler von Datenlänge ist BUG bei ClientEmpfang, sonst OK
#Buffer = 8
*Buffer = AllocateMemory(32)
#Port = 3000 ; 7000 war bei mir schon belegt
If Not CreateNetworkServer(0, #Port)
  Debug "Beendet"
  End
EndIf
ConnectionID = OpenNetworkConnection("127.0.0.1", #Port)
While ClientID = 0
  Select NetworkServerEvent()
    Case #PB_NetworkEvent_Connect
      ClientID = EventClient()
  EndSelect
Wend
Quad.q = 12345678890
If #Variante
  SendNetworkData(ClientID, @Quad, 8)
  SendNetworkData(ClientID, @Quad, 8)
  id = ConnectionID
Else
  SendNetworkData(ConnectionID, @Quad, 8)
  SendNetworkData(ConnectionID, @Quad, 8)
  id = ClientID
EndIf
Repeat
  If #Variante
    Event = NetworkClientEvent(id)
  Else
    Event = NetworkServerEvent()
  EndIf
  Select Event
    Case #PB_NetworkEvent_Data
      Repeat
        Debug "ReceiveNetworkData START"
        length = ReceiveNetworkData(id, *Buffer+Shift, #Buffer)
        Debug "ReceiveNetworkData ENDE mit "+Str(length)+" Bytes"
        If length > 0 : Shift + length : EndIf
        ; client check
        If #Variante = 1
          If Not NetworkClientEvent(id) = #PB_NetworkEvent_Data
            Break
          EndIf
        EndIf
        ; 
      Until length < #Buffer
      Debug PeekQ(*Buffer)
      Debug PeekQ(*Buffer+8)
      Quit = #True
      
  EndSelect
  
Until Quit

Debug "Beendet"
ich find auch das es schöner wäre, wenn es nicht hängenbleiben würde,
aber bug ist das glaub ich keiner, weil wenn man schön brav vorher prüft ob daten da sind dann klappt ja alles.
PureBasic 4.40 (Windows - x86)
Pandorra
Beiträge: 124
Registriert: 10.02.2007 12:15

Re: Problem mit ReceiveNetworkData - Bleibt beim Clienten hängen

Beitrag von Pandorra »

Ist auch kein Bug.
Das Problem ist nur, dass wenn keine Daten mehr da sind, die ReceiveNetworkData() einlesen kann, versucht dieser eine Netzwerk Datei(usw.) einzulesen, bis eine Datei im Buffer ist.
Denke mal ,dass das Programm sofort wieder einen Tick weiterläuft wenn man eine Datei schickt.
Benutze PB v 4.40 Beta 3
Benutzeravatar
STARGÅTE
Kommando SG1
Beiträge: 7028
Registriert: 01.11.2005 13:34
Wohnort: Glienicke
Kontaktdaten:

Re: Problem mit ReceiveNetworkData - Bleibt beim Clienten hängen

Beitrag von STARGÅTE »

OKe aber warum gibt ReceiveNetworkData() eine -1 zurück (also das nix zu lesen da ist) wenn die ConnectionID ein EventClient() vom Server ist ?

Ich finde man sollte sich da entscheiden, entweder "immer hängen bleiben" sodass man halt immer NetworkClientEvent noch mal testet, oder immer eine -1 zurück geben dami man ich das abfragen von NetworkClientEvent innerhalb der LeseSchleife sparen kann.

Ich meine mir ist es ja inzwischen egal, weil ich ja n andern Weg gefunden habe, trotzden sollte das mal jemand begutachten.
PB 6.01 ― Win 10, 21H2 ― Ryzen 9 3900X, 32 GB ― NVIDIA GeForce RTX 3080 ― Vivaldi 6.0 ― www.unionbytes.de
Aktuelles Projekt: Lizard - Skriptsprache für symbolische Berechnungen und mehr
Pandorra
Beiträge: 124
Registriert: 10.02.2007 12:15

Re: Problem mit ReceiveNetworkData - Bleibt beim Clienten hängen

Beitrag von Pandorra »

könnte ja nur daran liegen das EventClient() die ID von dem Clienten zurückgibt der was gesendet hat.
Da aber in diesem Fall niemand was gesendet hat, gibt EventClient auch nicht den Clienten zurück.
Wenn ReceiveNetworkData() das erlemmt gibt es -1 zurück.
Ist aber nur eine Vermutung.
Muss ich selber mal prüfen.

- Pandorra
Benutze PB v 4.40 Beta 3
Antworten