Pack-Engine by VikenEmesh

Übersicht BlitzBasic Codearchiv

Neue Antwort erstellen

hazumu-kun

Betreff: Pack-Engine by VikenEmesh

BeitragSa, Jul 04, 2009 15:11
Antworten mit Zitat
Benutzer-Profile anzeigen
Die Pack Engine ist eine Sammlung von Funktionen um Dateien, oder im
Allgemeinen Datenblöcke, über Netzwerk-streams zu senden und empfangen.

Download (BB-Code,8kb)

Code: [AUSKLAPPEN]

;####################################
;# Datenpaket-Engine by Viken Emesh /
;#   Version:   1.2
;#   Datum:      17.04.2009
;#   Kontakt:
;#      e-Mail:   kevin66@hotmail.de
;#      ICQ:   294-793-975

;#   HINWEIS:    Ein über Netzwerk gesendetes Paket beinhaltet
;#            zusätzliche 4 Bytes um die Länge des Pakets für
;#            den Befehl ReadString zu kennzeichnen.

DebugLog "Initialisiere Pack-Engine by Viken Emesh..."

Type Pack
   Field b_hndl
   Field b_size
End Type

Global PackOBJCount

Function CreatePack% (inp_Stream, inp_Size)
   ;Erzeugt neues Paket und füllt es mit Daten aus
   ;dem angegebenem Stream. Wenn zu wenig Daten im
   ;Stream vorhanden sind, enthält das Paket Nullbytes.
   ;Existiert der Stream nicht werden keine Daten
   ;eingelesen.
   ;Parameter:
   ;   inp_Stream   %   Stream auf den Read Befehle
   ;               angewendet können.
   ;               0= Nur Paket erstellen
   ;   inp_Size   %   Anzahl der Bytes die das Paket
   ;               enthalten soll. (min.: 128)
   ;   stream_Type   %   0= Netzwerkstream
   ;               1= Dateistream      
   ;
   ;Return:
   ;   %   Handle eines Pack-Objekts.
   ;      -1 Bei falschen Parametern
   
   Local new_Pack.Pack= New Pack         ;Paket erstellen
   new_Pack\b_hndl= CreateBank (inp_Size)
   new_Pack\b_size= inp_Size
   
   PackOBJCount= PackOBJCount+1
   
   If inp_Stream Then                  ;Paket füllen
      Local bytecount
      For bytecount= 1 To inp_Size
         PokeByte new_Pack\b_hndl, bytecount-1, ReadByte (inp_Stream)
         If Eof (inp_Stream) Then      ;Paket ggf. anpassen(DateiStream)
            Exit
         EndIf
      Next
   EndIf
   
   Return Handle (new_Pack.Pack)
End Function

Function GetPackSize% (inp_Handle)
   ;Gibt Größe eines Packets zurück.
   ;Parameter:
   ;   inp_Handle   %   Handle eines Pack-Objects.
   ;
   ;Return:
   ;   %   Größe des Pakets in Byte.
   
   Local acc_Pack.Pack= Object.Pack(inp_Handle)
   
   Return acc_Pack\b_size
End Function

Function GetActivePackObjects% ()
   ;Gibt zurück wieviele Pack-Objekte existieren.
   ;Return:
   ;   %   Anzahl der Pack-Objekte
   
   Return PackOBJCount
End Function

Function KillAllPackObjects% ()
   ;Löscht alle Pack-Objekte.
   ;ACHTUNG:    Zugriffe über Handles deren Objekt
   ;         gelöscht wurde, erzeugt
   ;         Speicherzugriffsverletzungen.
   ;Return:
   ;   %   Anzahl der Objekte die gelöscht wurden.
   
   Local oldcount= PackOBJCount
   
   Local del_Pack.Pack
   For del_Pack= Each Pack
      FreeBank del_Pack\b_hndl
      Delete del_Pack
   Next
   
   PackOBJCount= 0
   Return oldcount
End Function

Function DeletePack (inp_Handle)
   ;Löscht erst die Bank des Pakets
   ;und dann das Pack-Object.
   ;Parameter:
   ;   inp_Handle   %   Handle eines Pack.Objects
   ;Return:
   ;   [void]
   
   Local acc_Pack.Pack= Object.Pack(inp_Handle)
   
   FreeBank acc_Pack\b_hndl
   Delete acc_Pack
   
   PackOBJCount= PackOBJCount-1
End Function

Function ReadPack% (out_Handle, inp_Stream)
   ;Füllt ein vorhandenes Paket mit Daten aus einem
   ;Stream. Wenn der Stream zu wenig Daten enthält,
   ;wird das Paket entsprechend verkleinert.
   ;Parameter:
   ;   inp_Handle   %   Handle eines Pack-Objekts.
   ;   inp_Stream   %   Stream auf den Read-Befehle
   ;               angewendet werden können.
   ;Return:
   ;   %   Anzahl der Bytes die geschrieben wurden.
   
   Local acc_Pack.Pack= Object.Pack(out_Handle)
   Local inp_Size= acc_Pack\b_size
   
   Local bytesavail= ReadAvail (inp_Stream)   ;Paket ggf. anpassen(NetzwerkStream)
   If bytesavail<inp_Size And bytesavail<>0  Then
      inp_Size= bytesavail
      ResizeBank acc_Pack\b_hndl,inp_Size
   EndIf
   
   Local bytecount                        ;Paket füllen
   For bytecount= 1 To inp_Size
      PokeByte acc_Pack\b_hndl, bytecount-1, ReadByte (inp_Stream)
      If Eof (inp_Stream) Then            ;Paket ggf. anpassen(DateiStream)
         ResizeBank acc_Pack\b_hndl,bytecount
         Exit
      EndIf
   Next
   
   Return bytecount
End Function

Function WritePack% (inp_Handle, out_Stream)
   ;Schreibt den Inhalt eines Pakets in eine Datei.
   ;Parameter:
   ;   inp_Handle   %   Handle eines Pack-Objekts.
   ;   out_Stream   %   Dateistream zur Ausgabe.
   ;Return:
   ;   %   Anzahl der geschriebenen Bytes.
   
   Local acc_Pack.Pack= Object.Pack(inp_Handle)
   
   Return WriteBytes (acc_Pack\b_hndl,out_Stream,0,acc_Pack\b_size)
End Function

Function WritePack2Bank% (inp_Handle, out_Handle, out_Start=0)
   ;Speichert den Inhalt eines Pakets in eine Bank.
   ;Wenn die Bank zu klein sein sollte werden nicht alle
   ;Daten kopiert.
   ;Parameter:
   ;   inp_Handle   %   Handle eines Pack-Objekts.
   ;   out_Handle   %   Handle der Bank.
   ;   out_Start   %   Startposition in der Bank (ab 0).
   ;Return:
   ;   %   Anzahl der kopierten Bytes.
   
   Local acc_Pack.Pack= Object.Pack(inp_Handle)
   
   Local CopyLength, out_Size= BankSize(out_Handle)   ;Kopierlänge anpassen
   If out_Start+acc_Pack\b_size>out_Size-1 Then
      CopyLength= (out_Size-1)-out_Start+1
   Else
      CopyLength= acc_Pack\b_size+1
   EndIf
   
   CopyBank acc_Pack\b_hndl,0,out_Handle,out_Start,CopyLength
   
   Return CopyLength
End Function

Function WriteBank2Pack% (inp_Handle, out_Handle, inp_Start=0, inp_Length=0)
   ;Kopiert den Inhalt des festgelegten Bereichs in
   ;einer Bank in das Paket. Sollte das Paket zu
   ;klein oder zu groß für die Datenmenge sein,
   ;wird es entsprechend angepasst.
   ;Parameter:
   ;   inp_Handle   %   Handle der Bank
   ;   out_Handle   %   Handle eines Pack-Objects.
   ;   inp_Start   %   Startposition in der Bank zum
   ;               Kopieren.
   ;               (0= Ab Anfang kopieren.)
   ;   inp_Length   %   Datenmenge in Byte die kopiert
   ;               werden soll.
   ;               (0= maximal mögliche Menge= Pack_Size)
   ;   
   ;Return:
   ;   %   Anzahl der kopierten Bytes
   Local acc_Pack.Pack= Object.Pack(out_Handle)
   
   Local inp_Size= BankSize (inp_Handle)   ;Kopierlänge anpassen
   If inp_Length>inp_Size Then inp_Length=inp_Size
   
   Local CopyLength      
   Local out_Size= acc_Pack\b_size
   
   If inp_Length=0 Then
      inp_Length= out_Size
   EndIf
   If inp_Length>=out_Size Then
      CopyLength= out_Size
   Else
      CopyLength= inp_Length
   EndIf
   
   CopyBank inp_Handle,inp_Start,acc_Pack\b_hndl,0,CopyLength
   
   Return CopyLength
End Function

Function SendPack% (inp_Handle, net_Stream)
   ;Versendet ein Paket durch einen TCP Stream.
   ;Parameter:
   ;   inp_Handle   %   Handle eines Pack-Objects.
   ;   net_Stream   %   TCP NetzwerkStream.
   ;
   ;Return:
   ;   %   Anzahl der gesendeten Bytes.
   
   Local acc_Pack.Pack= Object.Pack(inp_Handle)
   Local Pack_Data$
   Local Pack_Size= acc_Pack\b_size
   Local Pack_Bank= acc_Pack\b_hndl
   
   Local i
   For i= 1 To Pack_Size
      Pack_Data$= Pack_Data$+ Chr$(PeekByte(Pack_Bank,i-1))
   Next
   
   WriteString net_Stream,Pack_Data$
   
   Return Pack_Size
End Function

Function RecvPack% (out_Handle, net_Stream)
   ;Füllt ein Paket mit Daten aus einem TCP Stream.
   ;Bytes die nicht in das Paket reinpassen werden
   ;verworfen.
   ;Parameter:
   ;   out_Handle   %   Handle eines Pack-Objects.
   ;   net_Stream   %   TCP NetzwerkStream.
   ;
   ;Return:
   ;   %   Anzahl der empfangenen Bytes.
   
   Local acc_Pack.Pack= Object.Pack(out_Handle)
   Local Pack_Data$
   Local Pack_Size= acc_Pack\b_size
   Local Pack_Bank= acc_Pack\b_hndl
   
   Pack_Data$= ReadString$ (net_Stream)
   
   Local i
   For i= 1 To Pack_Size
      PokeByte Pack_Bank,i-1,Asc(Mid$(Pack_Data$,i,1))
   Next
   
   Return Pack_Size
End Function

DebugLog "Pack-Engine initialisiert!"

;#
;# End-Of-Engine \
;#################


Über Kritik würde ich mich freuen!

MFG

EDIT:
Hier ein Stück Source zum Testen der Engine:

Code: [AUSKLAPPEN]

Include "Pack_Engine.eng.bb"

Stop
.Prompt
Local mode$= Input$("[S]erver oder [C]lient?: ")

Local server,client
Local Pack
Local File
Local File_Size
Select Upper$(mode$)
   Case "S"
      File= ReadFile ("TEST.TXT")      ;Paket erstellen
      File_Size= FileSize ("TEST.TXT")
      
      Pack= CreatePack (File,File_Size)
      Stop
      server= CreateTCPServer (21)   ;Paket versenden
      
      While Not client
         Print "Warte auf Clienten."
         client= AcceptTCPStream (server)
         Delay 100
      Wend
      
      WriteLine client,File_Size
      
      While Not ReadAvail (client)
      Wend
      ReadLine$ (client)
      
      Delay 500
      Print SendPack (Pack,client)+" Bytes gesendet!"
      Input("Enter Drücken zum Beenden.")
      CloseTCPStream client
      CloseTCPServer server
      End
      
   Case "C"
      server= OpenTCPStream ("127.0.0.1",21)
      Local Pack_Size= ReadLine$ (server)
      
      Pack= CreatePack (0,Pack_Size)
      WriteLine server,"Okay"
      
      While Not ReadAvail (server)
         Print "Warte auf Daten..."
         Delay 100
      Wend
      Print ReadAvail (server)+" Bytes bereit!"
      
      Print RecvPack (Pack,server)+" Bytes empfangen!"
      CloseTCPStream server
      
      File= WriteFile ("RECV.TXT")
      
      Print WritePack (Pack,File)+" Bytes geschrieben!"
      
      Input("Enter Drücken zum Beenden.")
   Default
      Print "Falsche Eingabe!"
      Goto Prompt
End Select


* Juhuuu 800tes Topic * *freu*

hazumu-kun

BeitragSo, Jul 05, 2009 17:27
Antworten mit Zitat
Benutzer-Profile anzeigen
* push *

Man Leute ich brauch FeedBack.
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

BladeRunner

Moderator

BeitragSo, Jul 05, 2009 18:16
Antworten mit Zitat
Benutzer-Profile anzeigen
Push macht Trash, also lass das.
Zu Diensten, Bürger.
Intel T2300, 2.5GB DDR 533, Mobility Radeon X1600 Win XP Home SP3
Intel T8400, 4GB DDR3, Nvidia GF9700M GTS Win 7/64
B3D BMax MaxGUI

Stolzer Gewinner des BAC#48, #52 & #92

hazumu-kun

BeitragSo, Jul 05, 2009 19:14
Antworten mit Zitat
Benutzer-Profile anzeigen
Okay. Aber trotzdem wärs schön wenn ich Kritik bekommen würde.
Warum kann es keine omnipotente Macht geben?
Weil diese omnipotente Macht in der Lage sein müsste, einen so schweren Stein zu schaffen, dass sie ihn nicht heben kann
-> nicht omnipotent

Neue Antwort erstellen


Übersicht BlitzBasic Codearchiv

Gehe zu:

Powered by phpBB © 2001 - 2006, phpBB Group