Seite 1 von 1

Problem mit SendNetworkString und SendNetworkData

Verfasst: 09.12.2007 10:49
von TMoe
Hi,

ich bin neu hier im Board und hab gleich schon ein Problem. Ich habe versucht einen kleinen chat zu schreiben, bei dem ich SendNetworkString verwende. Nun habe ich teilweise den Fall, dass bei dem Client mehrere Datensaetze ankommen, bevor er sie abruft. Dann fasst er sie aber immer in einen zusammen.

Beispiel:
Ich sende nach einander
"Hallo"
"Welt"
"Wie"
"Gehts"

Wenn ich die aber zu schnell hinter einander sende, kommt das beim client als "HalloWeltWieGehts" an.

Wisst ihr was man dagegen machen kann?

Verfasst: 09.12.2007 11:43
von Deeem2031

Verfasst: 09.12.2007 12:00
von Deluxe0321
Server:

Code: Alles auswählen

Enumeration
  #Listview_0
  #String_0
  #Button_0
EndEnumeration

Procedure Open_window()
  If OpenWindow(0, 256, 211, 315, 279, "Server",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(0))
      ListViewGadget(#Listview_0, 0, 0, 315, 250)
      StringGadget(#String_0, 0, 255, 235, 20, "")
      ButtonGadget(#Button_0, 240, 255, 75, 20, "Senden")
    EndIf
  EndIf
EndProcedure


InitNetwork() 
If ExamineIPAddresses() 
  IP.l = NextIPAddress() 
EndIf 

If CreateNetworkServer(0, 6654) 
    Open_window()
    AddGadgetItem(#Listview_0,-1,"Server Online Listening on IP (" + IPString(IP) + ")")
  
  Repeat
    
  Event = WindowEvent()
  GadgetID = EventGadget() 
  
  If Event = #PB_Event_Gadget
      
    If GadgetID = #Button_0
      String$=GetGadgetText(#String_0)
      SetGadgetText(#String_0,"")
      If ClientID.l
        SendNetworkData(ClientID.l, @String$, Len(String$))
      Endif   
    EndIf
    
  EndIf
   
    Select NetworkServerEvent() 
      Case 0 
        Delay(1) 
      Case 1 
        AddGadgetItem(#Listview_0,-1,"Ein neuer Client hat Connectet") 
        ClientID.l = EventClient() 
      Case 2 
        *buffer = AllocateMemory(2000) 
        length.l = ReceiveNetworkData(ClientID, *buffer, 2000) 
        String$ = PeekS(*buffer, 2000) 
        AddGadgetItem(#Listview_0,-1,"Received:" + String$)
        FreeMemory(*buffer) 
    EndSelect  
  Until Event = #PB_Event_CloseWindow 
EndIf  
End 
Client:

Code: Alles auswählen

Enumeration
  #Listview_0
  #String_0
  #Button_0
EndEnumeration

Procedure Open_window()
  If OpenWindow(0, 256, 211, 315, 279, "Client",  #PB_Window_SystemMenu | #PB_Window_SizeGadget | #PB_Window_TitleBar )
    If CreateGadgetList(WindowID(0))
      ListViewGadget(#Listview_0, 0, 0, 315, 250)
      StringGadget(#String_0, 0, 255, 235, 20, "")
      ButtonGadget(#Button_0, 240, 255, 75, 20, "Senden")
    EndIf
  EndIf
EndProcedure

If InitNetwork() = 0 
  MessageRequester("Error", "Error") 
EndIf 
ip$ = "127.0.0.1"
ConnectionID = OpenNetworkConnection(ip$, 6654) 
If ConnectionID
Open_window() 
Repeat 
  
  Event = WindowEvent()
  GadgetID = EventGadget() 
  
  If Event = #PB_Event_Gadget
      
    If GadgetID = #Button_0
      String$=GetGadgetText(#String_0)
      SetGadgetText(#String_0,"")
      SendNetworkData(ConnectionID, @String$, Len(String$)) 
    EndIf
    
  EndIf

  Sev=NetworkClientEvent(ConnectionID)
    If Sev = #PB_NetworkEvent_Data
      *Buffer=AllocateMemory(1000)
      ReceiveNetworkData(ConnectionID, *Buffer, 1000)
      AddGadgetItem(#Listview_0,-1,PeekS(*Buffer))
      FreeMemory(*Buffer)
    ElseIf Sev = 0
      Delay(1)
    EndIf
  
Until Event = #PB_Event_CloseWindow 
EndIf
End
Ich denke bei näherer Betrachtung des Codes wirst du festellen wie ich das Regele.
Vor jedem Empfang einer "Nachricht" reservire ich mir etwas Speicher, schreibe in diesen den Empfang, gebe ihn aus & lösche dann den Speicherbereich wieder.

Keine Ahnung ob meine Methode richtig ist, aber bei mir hat sie bissher immer prima funktioniert
:mrgreen:

Gruß Marvin

Edit://WaitWindowEvent => WindowEvent (danke HeXor, hab ich verpeilt)

Verfasst: 09.12.2007 14:17
von HeX0R
Deluxe0321 hat geschrieben: Keine Ahnung ob meine Methode richtig ist, aber bei mir hat sie bissher immer prima funktioniert
:mrgreen:
Ich würde mal beim Überfliegen deines Codes vermuten, dass deine Sende-/Empfangen-Routinen nur funktionieren, wenn du die Maus übers Fenster fährst, was schon mal recht unpraktikabel ist.

Ausserdem solltest du mindestens das Nullbyte des Strings mitschicken, besser noch die Länge, weil dein Server sonst keine Ahnung hat wo ein String anfängt und der andere aufhört.

Verfasst: 09.12.2007 20:14
von mk-soft
Buffer brauch nicht immer gelöscht werden. Len Von ReceiveNet... auswerten

Code: Alles auswählen

len = ReceiveNetworkData(ConnectionID, *Buffer, 1000)
text.s = PeekS(*Buffer, len)
FF :wink: