Seite 1 von 1

Problem mit ReceiveNetworkData - Bleibt beim Clienten hängen

Verfasst: 10.09.2009 01:40
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!

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

Verfasst: 10.09.2009 20:17
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 ;)

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

Verfasst: 10.09.2009 23:26
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.

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

Verfasst: 12.09.2009 18:12
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.

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

Verfasst: 14.09.2009 23:15
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.

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

Verfasst: 14.09.2009 23:32
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.

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

Verfasst: 15.09.2009 15:48
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