Problem mit SendNetworkString und SendNetworkData

Anfängerfragen zum Programmieren mit PureBasic.
TMoe
Beiträge: 3
Registriert: 08.12.2007 07:19
Kontaktdaten:

Problem mit SendNetworkString und SendNetworkData

Beitrag 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?
Benutzeravatar
Deeem2031
Beiträge: 1232
Registriert: 29.08.2004 00:16
Wohnort: Vorm Computer
Kontaktdaten:

Beitrag von Deeem2031 »

Bild
[url=irc://irc.freenode.org/##purebasic.de]irc://irc.freenode.org/##purebasic.de[/url]
Benutzeravatar
Deluxe0321
Beiträge: 336
Registriert: 19.05.2006 00:31
Kontaktdaten:

Beitrag 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)
Zuletzt geändert von Deluxe0321 am 09.12.2007 18:47, insgesamt 1-mal geändert.
Benutzeravatar
HeX0R
Beiträge: 3042
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:

Beitrag 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.
Benutzeravatar
mk-soft
Beiträge: 3855
Registriert: 24.11.2004 13:12
Wohnort: Germany

Beitrag 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:
Alles ist möglich, fragt sich nur wie...
Projekte ThreadToGUI / EventDesigner V3 / OOP-BaseClass-Modul
Downloads auf MyWebspace / OneDrive
Antworten