Network Extended - Daten sicher übertragen -
Verfasst: 17.08.2006 16:17
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:
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:
-Beispiele-
Client:
Server:
mfg
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
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
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)