Seite 1 von 1

Wenig bis kein Auslösen des #PB_NetworkEvent_Data ?

Verfasst: 02.05.2013 01:49
von Bisonte
Hallo.

Ich wollt da mal ein wenig von dem Server/Client "Krams" benutzen, um meinem Programm ein
wenig Kommunikation zu ermöglichen, da stiess ich auf eine Merkwürdigkeit.

In meinem leicht abgewandeltem Beispiel vom Server.pb und Client.pb aus der Hilfe
habe ich das Problem, das ohne Delays im Senden, beim Server kein #PB_NetworkEvent_Data
auftritt...
Connect und Disconnect werden problemlos erkannt. Sobald ich da grössere Delays (so ab 100ms)
einfüge, scheint es zu funktionieren.
Es ist auch egal ob ich zum Senden SendNetworkString() oder das selbstgebaute SendNetString()
benutze...

Ist es ein Bug, oder mach ich da nur irgendwo etwas falsch ?

Hier die beiden Dateien :

Code: Alles auswählen

; Server.pb

If InitNetwork() = #False : End : EndIf
ID = CreateNetworkServer(#PB_Any, 6832, #PB_Network_TCP)
If Not ID : End : EndIf

Counter = 0 ; <-- zum zählen der gesamten NetworkServerEvents()

Repeat
  
  SEvent = NetworkServerEvent()
  
  If SEvent
    
    Counter + 1
    EClient = EventClient()
    
    Select SEvent
      Case #PB_NetworkEvent_Data
        Debug "Data "+Str(EClient)
        *Buffer = AllocateMemory(1024)
        ReceiveNetworkData(EClient, *Buffer,1024)
        Debug PeekS(*Buffer+4, PeekL(*Buffer), #PB_UTF8)
        FreeMemory(*Buffer)
        
      Case #PB_NetworkEvent_Connect
        Debug "Connect "+Str(EClient)
        
      Case #PB_NetworkEvent_Disconnect
        Debug "Disconnect "+Str(EClient)
        Quit = 1
        
      Case #PB_NetworkEvent_None
        Delay(1) 
        
    EndSelect
  Else
    Delay(1)
  EndIf
  
Until Quit > 0
CloseNetworkServer(ID)
Debug "Events = " + Str(Counter)

Code: Alles auswählen

; Client.pb
If InitNetwork() = #False : End : EndIf
IP.s = "127.0.0.1"
ID = OpenNetworkConnection(IP, 6832, #PB_Network_TCP)
If Not ID : End : EndIf

Procedure SendNetString(ClientID, String$, Format = #PB_UTF8)
  
  Protected Size.l = StringByteLength(String$, Format)+1
  Protected *Buffer = AllocateMemory(Size+SizeOf(Long))
  Protected Bytes = 0
  
  Debug "Size = "+Str(Size)
  
  If *Buffer
    
    PokeL(*Buffer, Size)
    Bytes = PokeS(*Buffer + 4, String$, Size, Format)
    Debug "Poke = "+Str(Bytes)
    If ClientID
      Bytes = SendNetworkData(ClientID, *Buffer, Size+SizeOf(Long))
      Debug "Send = "+Str(Bytes)
      ;Delay(100)
    EndIf
    FreeMemory(*Buffer)  
    
  EndIf
  
EndProcedure

SendNetString(ID, "Hallo")
SendNetString(ID, "Du Da, im Radio")
SendNetString(ID, "Du bist doch nicht alleine")
CloseNetworkConnection(ID)
;Delay(100)

Re: Wenig bis kein Auslösen des #PB_NetworkEvent_Data ?

Verfasst: 02.05.2013 10:31
von STARGÅTE
Ohne Delay, sendet der Client so schnell, dass die drei Strings, als ein #PB_NetworkEvent_Data beim Server ankommen.
Dort bist du nun selbst dafür verantworlich, die Daten richtig zu lesen und die Strings wieder zu entfalten.

Das alle drei Strings mit dem ersten ReceiveNetworkData() empfangen werden kannst du mit ShowMemoryViewer() sehen, wo die 3 Longs mit den 3 Strings zu sehen sind.
038307D0 06 00 00 00 48 61 6C 6C 6F 00 10 00 00 00 44 75 ....Hallo.....Du
038307E0 20 44 61 2C 20 69 6D 20 52 61 64 69 6F 00 1B 00 Da, im Radio...
038307F0 00 00 44 75 20 62 69 73 74 20 64 6F 63 68 20 6E ..Du bist doch n
03830800 69 63 68 74 20 61 6C 6C 65 69 6E 65 00 00 00 00 icht alleine....
Im Forum gibt es bereits ausführliche diskussionen (Suchwort: ReceiveNetworkData) zum Thema: Dass SendNetworkData/ReceiveNetworkData nicht wie "Pakete" behandet werden dürfen. Ein SendNetworkData kann in mehrere ReceiveNetworkData "zerfallen" oder andersrum.

Re: Wenig bis kein Auslösen des #PB_NetworkEvent_Data ?

Verfasst: 02.05.2013 11:05
von Bisonte
Ah ich glaub nun hab ich es verstanden.
Ich habe mit dem ReceiveNetworkData() schon alles ausgelesen beim ersten mal, wegen der Buffergrösse von 1024,
da meine Strings alle zusammen kleiner sind als das.... Deswegen nur ein Event...

Also im ersten Durchgang, nur die Grösse aus dem Empfangsbuffer holen, damit das Event weiter ansteht, dann den String usw.

Danke für die Erleuchtung, ich glaub es war schon recht spät :coderselixir: