Sicherer Ablauf mti TCP-Daten und grafische Darstellung

Für allgemeine Fragen zur Programmierung mit PureBasic.
funkheld
Beiträge: 651
Registriert: 31.12.2009 11:58

Sicherer Ablauf mti TCP-Daten und grafische Darstellung

Beitrag von funkheld »

Hallo, guten Tag.
Ich habe hier ein Programm um Fahrdaten vom Clienten ZUSI abzufragen.
Nun stelle ich diese auch sofort im gleichen Programm grafisch dar.

Kann das Programm mit den TCP-Event irgendwie überfordert werden ?
Oder wo kann man da noch eine Überwachung reinbauen, damit keine Daten verloren gehen ?

Danke.

Gruss
peter

Code: Alles auswählen

Procedure sprite_neu(Sprite, x, y, xx, yy, w.f, dx, dy, h)
    w = w * (#PI/180)
    r.f = Sqr(Pow(xx,2)+Pow(yy,2))/2
    t.f = ATan(xx/yy)
    w1.f = w       - t : w2.f = w       + t : w3.f = w + #PI - t : w4.f = w + #PI + t
    TransformSprite3D(Sprite, Cos(w1)*r, Sin(w1)*r, Cos(w2)*r, Sin(w2)*r, Cos(w3)*r, Sin(w3)*r, Cos(w4)*r, Sin(w4)*r)
    Start3D()
      DisplaySprite3D(Sprite, x-Cos(w)*dy+Sin(w)*dx, y-Sin(w)*dy-Cos(w)*dx, h)
    Stop3D()
EndProcedure


Global EventID.l,ClientID.l,rData.l,anz_id.l
Global text.s,wert.l,z.l,offs.l,geschw.l, motor.l 

Declare zusi_verbinden()
Declare auswerten()
Declare zeige_daten()

Enumeration
  #Window_0
  #Button_1
  #Button_2
  #String_0
  #String_1
  #String_2
  #zeiger1
  #anzeiger1
  #zeiger2
  #anzeiger2
EndEnumeration

Global *sbuffer = AllocateMemory(256)
Global *rbuffer = AllocateMemory(256)
Global *buffer = AllocateMemory(256)

InitSprite()
InitSprite3D()
InitNetwork()

CreateNetworkServer(1, 1435)

OpenWindow(#Window_0, 10, 10, 420,400, "Tcp-Server-Pult", #PB_Window_SystemMenu|#PB_Window_MinimizeGadget|#PB_Window_ScreenCentered)
OpenWindowedScreen(WindowID(#Window_0),5,100,400,200,0,0,0)

   StringGadget(#String_0, 10, 10, 120, 20, "")
   StringGadget(#String_1, 5, 60, 80, 30, "")
   StringGadget(#String_2, 100, 60, 80, 30, "")

   CreateSprite(#zeiger1,200,200, #PB_Sprite_Texture)
   CreateSprite3D(#zeiger1, #zeiger1)
   CreateSprite(#anzeiger1, 200,200, #PB_Sprite_Texture)
   CreateSprite3D(#anzeiger1, #anzeiger1)
   
   CreateSprite(#zeiger2,200,200, #PB_Sprite_Texture)
   CreateSprite3D(#zeiger2, #zeiger2)
   CreateSprite(#anzeiger2, 200,200, #PB_Sprite_Texture)
   CreateSprite3D(#anzeiger2, #anzeiger2)
   
   StartDrawing(SpriteOutput(#anzeiger1))
     Box(0,0,200,200,RGB(255,0,255))
     Circle(100,100,90,RGB(180,180,180))
   StopDrawing()
   StartDrawing(SpriteOutput(#zeiger1))
     Box(0,0,200,200,RGB(255,0,255))
     RoundBox(100,100,85,6,3,3,RGB(0,255,0))
   StopDrawing()
     
   StartDrawing(SpriteOutput(#anzeiger2))
     Box(0,0,200,200,RGB(255,0,255))
     Circle(100,100,90,RGB(180,180,180))
   StopDrawing()
   StartDrawing(SpriteOutput(#zeiger2))
     Box(0,0,200,200,RGB(255,0,255))
     RoundBox(100,100,85,6,3,3,RGB(255,0,0))
   StopDrawing()
 
   TransparentSpriteColor(#zeiger1, RGB(255, 0, 255))
   TransparentSpriteColor(#anzeiger1, RGB(255, 0, 255))
   TransparentSpriteColor(#zeiger2, RGB(255, 0, 255))
   TransparentSpriteColor(#anzeiger2, RGB(255, 0, 255))
   
   Sprite3DQuality(#PB_Sprite3D_BilinearFiltering )
   ClearScreen(RGB(140,140,140))
   
   sprite_neu(#anzeiger1,100,100,200,200,0,0,0,255)
   sprite_neu(#zeiger1,100,100,200,200,geschw+45,0,-3,255)
   
   sprite_neu(#anzeiger2,300,100,200,200,0,0,0,255)
   sprite_neu(#zeiger2,300,100,200,200,motor/10,0,-3,255)
   
   
 
Repeat
	EventID = WaitWindowEvent(3)    
	
  Select EventID
    Case #PB_Event_Gadget
      EventGadget = EventGadget()
      EventType = EventType()
  EndSelect
	
  Select NetworkServerEvent()
  	Case 1 
  		anz_id=anz_id+1
  		ClientID = EventClient()
  		If anz_id=1
  		  text+Str(ClientID)+Chr(10)
  		  SetGadgetText(#string_0, text)
  		  zusi_verbinden() 
  		EndIf	 		   	
  	Case 2
  	  rdata=ReceiveNetworkData(ClientID, *rbuffer, 255) 	
  	  auswerten()   
  EndSelect
  
  FlipBuffers()
  
Until EventID = #PB_Event_CloseWindow

Procedure zeige_daten()
    sprite_neu(#anzeiger1,100,100,200,200,0,0,0,255)
    sprite_neu(#zeiger1,100,100,200,200,geschw+45,0,-3,255)
    
    sprite_neu(#anzeiger2,300,100,200,200,0,0,0,255)
    sprite_neu(#zeiger2,300,100,200,200,motor/5,0,-3,255)
    
    SetGadgetText(#String_1,Str(geschw))
    SetGadgetText(#String_2,Str(motor))
EndProcedure

Procedure auswerten()    
    For z=6 To rData Step 5
      If z > rData
        Break
      EndIf
      
      wert=PeekB(*rbuffer+z)
    
      If wert=1
        PokeL(*buffer + 0, PeekL(*rbuffer+z+1))
        geschw=Int(PeekF(*buffer))     
      ElseIf wert=9
        PokeL(*buffer + 0, PeekL(*rbuffer+z+1))
        motor=Int(PeekF(*buffer))  
      EndIf  
    Next
    
    zeige_daten()
EndProcedure
  
Procedure zusi_verbinden()
    offs = 0 
    PokeL(*sbuffer + 0, $03) : offs + 4
    PokeA(*sbuffer + 4, $00) : offs + 1
    PokeA(*sbuffer + 5, $02) : offs + 1
    PokeA(*sbuffer + 6, $00) : offs + 1
    SendNetworkData(ClientID, *sbuffer, offs)
    Delay(100)
    offs = 0 
    PokeL(*sbuffer + 0, $06) : offs + 4
    PokeA(*sbuffer + 4, $00) : offs + 1
    PokeA(*sbuffer + 5, $03) : offs + 1
    PokeA(*sbuffer + 6, $00) : offs + 1
    PokeL(*sbuffer + 7, $0A) : offs + 1
    PokeA(*sbuffer + 8, $01) : offs + 1
    PokeA(*sbuffer + 9, $09) : offs + 1
    SendNetworkData(ClientID, *sbuffer, offs)
    Delay(100)  
    offs = 0 
    PokeL(*sbuffer + 0, $04) : offs + 4
    PokeA(*sbuffer + 4, $00) : offs + 1
    PokeA(*sbuffer + 5, $03) : offs + 1
    PokeA(*sbuffer + 6, $00) : offs + 1
    PokeA(*sbuffer + 7, $00) : offs + 1
    SendNetworkData(ClientID, *sbuffer, offs)   
EndProcedure
 

Benutzeravatar
WPö
Moderator
Beiträge: 669
Registriert: 27.05.2008 12:44
Wohnort: Oberland
Kontaktdaten:

Re: Sicherer Ablauf mti TCP-Daten und grafische Darstellung

Beitrag von WPö »

Moin, Peter!

Habe Deinen Quelltext zwar nicht angesehen, aber das Thema mit sicherem synchronem Datentransfer ist ja schonmal durchgekaut worden. Schau dort einfach nach.

Zum Datenaufkommen: Im schlimmsten Fall hast Du eine voll (= ca. 30%) ausgelastete Gigabit-Verbindung, was ca. 30MB/s sind. Bei einer üblichen MTU von 1500 Bytes ergeben sich 20.000 Pakete pro Sekunde. Die Ereignisschleife ordentlich prorammiert und sonst nicht zu viele Aufgaben zu erledigen, sollten diese von heutigen Maschinen noch abzuarbeiten sein.

Bei FastEthernet sinds nur noch 2000 Pakete/s und bei einer üblichen 6MBaud-Verbindung (100% Last) 400 Pakete/s. Diese Angaben gelten auch nur, wenn die jeweiligen Rückantworten keine Zeit brauchen. Damit kannst Du von vorhergehenden Zahlen nochmal die Hälfte abziehen.

Die 30% Leitungslast kommen deshalb zustande, da üblicherweise billige Kabel, billige Netzwerkkarten, schnell zusammengeschusterte Treiber und Paketkollisionen durch Switches die tatsächliche Auslastbarkeit reduzieren. Selbst mit sündhaft teuren Komponenten kommst Du nie über 60%.

Ich hoffe, ich konnte helfen.

Gruß - WPö
Ich glaube nur der Statistik, die ich selbst gefälscht habe!
Meine Netzpräsenz: WPö.de
PB5.31 auf LMDE und Pentium T7200 2,00GHz, 4GB DDR2, ATI X1400.
Benutzeravatar
cxAlex
Beiträge: 2111
Registriert: 26.06.2008 10:42

Re: Sicherer Ablauf mti TCP-Daten und grafische Darstellung

Beitrag von cxAlex »

WPö hat geschrieben: Die 30% Leitungslast kommen deshalb zustande, da üblicherweise billige Kabel, billige Netzwerkkarten, schnell zusammengeschusterte Treiber und Paketkollisionen durch Switches die tatsächliche Auslastbarkeit reduzieren. Selbst mit sündhaft teuren Komponenten kommst Du nie über 60%.
Also in dem Punkt muss ich widersprechen, hab erst letzten das gesamte Netzwerk im Haus auf 1 GBit/s Komponenten bzw. 300 MBit/s WLAN umgestellt, alles mit Customer Geräten (50€ Router, 20€ Switches und einige 5/10 Meter flexible! CAT5 Kabel in den Wänden) und erreiche im Upload/Download auf den FTP - Server im Keller doch von sämtlichen Anschlüssen stabil zwischen 90-95 MByte/s.

Gruß, Alex
Projekte: IO.pbi, vcpu
Pausierte Projekte: Easy Network Manager, µC Emulator
Aufgegebene Projekte: ECluster

Bild

PB 5.1 x64/x86; OS: Win7 x64/Ubuntu 10.x x86
Antworten