Network Extended - Daten sicher übertragen -

Hier könnt Ihr gute, von Euch geschriebene Codes posten. Sie müssen auf jeden Fall funktionieren und sollten möglichst effizient, elegant und beispielhaft oder einfach nur cool sein.
myself
Beiträge: 67
Registriert: 18.03.2006 12:48

Network Extended - Daten sicher übertragen -

Beitrag von myself »

hi, wenn ihr diese lib am anfang einfügt erweitert ihr euer PB um 2 befehle:
NX_SendBuffer und NX_ReceiveBuffer, Sind genau so einfach wie Receivenetworkdata und Sendnetworkdata zu verwenden, mit dem unterschied das hier 100% alles ankommt, sogar ganze dateien können so mühelos gesendet werden. Ausserdem verfügen die funktionen über 2 Optionale Parameter, der 1. ist ein Timeout, nach welcher zeit ohne aktivität aufgehört werden soll zu senden/empfangen (standard: 10000 ms) der 2. ist ein Callback auf eine funktion die ca. so aussehen kann:

Code: Alles auswählen

Procedure SendCallBack(sended,max) ; Sending Callback
  Debug "Sended "+Str(sended)+" of "+Str(max)+" Bytes"
EndProcedure
Sie sieht bei NX_SendBuffer und NX_ReceiveBuffer gleich aus und wird nach jedem erfolgreichen senden/empfangen von Daten aufgerufen, der 1. Parameter enthält die bereits gesendete/empfangene menge und der 2. die maximal zu sendende/ zu empfangende menge um z.B. zwischen dem übertragen großer Daten dem user einen zwischenstand geben zu können (Standard: 0 = kein Callback). So, hier die libs und ein Beispiel:

Lib:

Code: Alles auswählen

#NX_SEND_TIMEOUT = 0
#NX_SEND_SUCESS = 1
#NX_RECEIVE_TIMEOUT = 0
#NX_RECEIVE_SUCESS = 1

Procedure NX_SendBuffer(ID.l,Buffer.l,Length.l,TimeOut.l=10000,*CallBack.l=0)
  maxsize.l = Length
  Sended.l = 0
  Timer = ElapsedMilliseconds()
  SendNetworkData(ID.l,@maxsize,4) ; Header contains size of following Buffer
  ;-----
  Repeat
    Send_TMP = SendNetworkData(ID,Buffer,Length-Sended)
    If Send_TMP <> 0 And Send_TMP <> -1
      Sended = Sended + Send_TMP
      Timer = ElapsedMilliseconds()
      If *CallBack <> 0 ;Call the Callback
        CallFunctionFast(*CallBack,Sended,Length) 
      EndIf
    EndIf
    
    If ElapsedMilliseconds()-Timer >= TimeOut
      ProcedureReturn #NX_SEND_TIMEOUT ; Timeout
    EndIf
    
  Until Sended >= Length
  
  ProcedureReturn #NX_SEND_SUCESS ; Sucessfully sended Buffer
EndProcedure


Procedure NX_ReceiveBuffer(ID.l,Buffer.l,TimeOut.l=10000,*CallBack.l=0)
  maxsize.l = 0
  Received.l = 0
  Timer = ElapsedMilliseconds()
  ReceiveNetworkData(ID,@maxsize,4) ;read Header 
  Repeat
    Received_TMP = ReceiveNetworkData(ID,Buffer,maxsize-Received)
    If Received_TMP <> 0 And Received_TMP <> -1
      Received = Received + Received_TMP
      Timer = ElapsedMilliseconds()
      If *CallBack <> 0
        CallFunctionFast(*CallBack,Received,maxsize)
      EndIf
    EndIf
    
    If ElapsedMilliseconds()-Timer >= TimeOut
      ProcedureReturn #NX_SEND_TIMEOUT ; Timeout
    EndIf
    
  Until Received >= maxsize
  
  ProcedureReturn #NX_RECEIVE_SUCESS = 1
EndProcedure
-Beispiele-
Client:

Code: Alles auswählen

InitNetwork()
IncludeFile "nxtend.pb"

Procedure SendCallBack(sended,max) ; Sending Callback
  Debug "Sended "+Str(sended)+" of "+Str(max)+" Bytes"
EndProcedure

cid = OpenNetworkConnection("127.0.0.1",1234)
If cid = 0 : Debug "No Connection" : End : EndIf

Buffer = AllocateMemory(1000)
PokeS(Buffer,"Hello from a client")

NX_SendBuffer(cid,Buffer,1000,10000,@SendCallBack())

Repeat
  Delay(100)
Until GetAsyncKeyState_(#VK_ESCAPE)

Server:

Code: Alles auswählen

InitNetwork()
IncludeFile "nxtend.pb"

;CallBack for Receive
Procedure ReceiveCallBack(Received,max)
  Debug "Received:"+Str(Received)+" of "+Str(max)+" Bytes"
EndProcedure

CreateNetworkServer(0,1234)
Buffer = AllocateMemory(1000)

Repeat

If NetworkServerEvent() = 2
  If NX_ReceiveBuffer(EventClient(),Buffer,10000,@ReceiveCallBack()) = #NX_RECEIVE_SUCESS
      Debug "Sucessfully received Buffer, contains:"
      Debug PeekS(Buffer)
    Else
      Debug "Timeout while receiving"
  EndIf
EndIf

Delay(10)
Until GetAsyncKeyState_(#VK_ESCAPE)
mfg
Dristar
Beiträge: 72
Registriert: 13.09.2004 12:46

Beitrag von Dristar »

@myself

Ich habe da einen Fehler endeckt oder auch zwei :)
Ich habe mich schon gewundert warum die Daten nicht ankommen.

Code: Alles auswählen

orginal
     Send_TMP = SendNetworkData(ID,Buffer,Length-Sended) 
Received_TMP = ReceiveNetworkData(ID,Buffer,maxsize-Received) 

richtig
     Send_TMP = SendNetworkData(ID,Buffer+Sended,Length-Sended) 
Received_TMP = ReceiveNetworkData(ID,Buffer+Received,maxsize-Received) 

und bei beiden

Code: Alles auswählen

And Received_TMP <> -1
weg lassen .Weil ReceiveNetworkData auch ein minus sendet wenn er keine daten empfangen hat.Da reicht dein Timeout.

und danke für deine Routine :D
PB 4.61 Beta 1 , Linux Ubuntu 11.10 ...
Antworten