[Hilfe] Hilfe bei einer Packet Klasse

  • VB.NET

Es gibt 11 Antworten in diesem Thema. Der letzte Beitrag () ist von FreakJNS.

    [Hilfe] Hilfe bei einer Packet Klasse

    Hallo,

    also ich hab im Internet eine Klasse gefunden, die ein Packet erstellt. In dem Code Beispiel übergibt diese das Packet lokal, jetzt möchte ich das jedoch per Tcp/Ip senden, also das komplette Packet, nicht nur Header und nicht nur Data. Aber wie mach ich das, da es ja ein Objekt ist, oder gibt es eine andere Alternative zu dieser Klasse, evt. eine simplere oder effektivere?

    VB.NET-Quellcode

    1. Module Module1
    2. Sub Main(ByVal args As String())
    3. Dim P As New Packet(New Byte() {&H0}, System.Text.Encoding.Default.GetBytes("ABCD"))
    4. Dim T As New Packet(DirectCast(P.Combined, Byte()))
    5. If T.Header(0) = &H0 Then
    6. Console.WriteLine(System.Text.Encoding.Default.GetString(T.Data) & "|")
    7. End If
    8. Console.ReadLine()
    9. End Sub
    10. End Module
    11. Public NotInheritable Class Packet
    12. Public Header As Byte() = New Byte(0) {}
    13. Public Data As Byte() = New Byte(8192) {}
    14. Public ReadOnly Property Combined() As Object
    15. Get
    16. Dim C As Byte() = New Byte(Header.Length + (Data.Length - 1)) {}
    17. System.Buffer.BlockCopy(Header, 0, C, 0, Header.Length)
    18. System.Buffer.BlockCopy(Data, 0, C, Header.Length, Data.Length)
    19. Return C
    20. End Get
    21. End Property
    22. Public Sub New(ByVal ByteInput As Byte())
    23. Data = New Byte(ByteInput.Length - 2) {}
    24. System.Buffer.BlockCopy(ByteInput, 0, Header, 0, Header.Length)
    25. System.Buffer.BlockCopy(ByteInput, Header.Length, Data, 0, ByteInput.Length - Header.Length)
    26. End Sub
    27. Public Sub New(ByVal Header_ As Byte(), ByVal Data_ As Byte())
    28. Me.Header = Header_
    29. Me.Data = Data_
    30. End Sub
    31. End Class


    Lg

    redw00t_ 8-)
    Erklär doch mal was GENAU du unter einem Packet verstehst. Wenn du die TCP Klassen verwendest muss du dich nicht mehr um den Header usw. kümmern. Das wird alles voll automatisch auf den verschiedenen OSI-Layern hinzugefügt. Du musst lediglich sagen: Wohin und Was.


    Opensource Audio-Bibliothek auf github: KLICK, im Showroom oder auf NuGet.
    Ja so ziemlich, wie du siehst ist das ja eine ganz simpel Klasse, die ich gefunden habe & ich möchte es ja auch simpel halten. Deswegen ist die Hauptfrage, da es lokal prima klappt wie es möglich ist das Packet T zu senden über TCP oder ist das garnicht möglich? :/
    auch auf die Gefahr hin, dasses schon öfters erwähnt wurde: Bei TCP brauchst du dich um Pakete nicht zu kümmern. Die Paketierung der Daten übernimmt der TCPClient für dich - du merkst da ühaupt nix von.
    Du bekommst einen Networkstream, und da kannste reinschreiben, was du wolle. Ob nun Strings, Datumse oder sonst welche Klassen - alles immer rein damit.
    Bei sonstwelchen Klassen musstedir allerdings was mit Serialisierung überlegen. Aber Pakete - dazu gibts ja TCP, dass man mit so Kram sich nicht herumärgern muss!
    Ja inzischen weiß ich das auch :P ich wollte nur immer bevor das "Packet" in dem Fall durch den Header indentifizieren und anhand von der identifizierung das Packet verarbeiten. Ich weiß die Klasse macht kein richtiges Packet, macht jedoch eigentlich genau das was ich brauche, nur ich kann sie nicht benutzen, da ich dieses Packet nicht senden kann.

    Am liebsten wäre es mir wenn ich dieses Objekt T einfach per Networkstream senden kann
    Ok Danke soweit, nur wie genau 8| :)
    Bisher:

    VB.NET-Quellcode

    1. Imports System.Runtime.Serialization.Formatters.Binary
    2. Dim binform As New BinaryFormatter
    3. binform.Serialize(T)

    Oder wie genau :) und wie konvertiere ich es beim empfang wieder zurück?
    für die meisten komplizierten Probleme gibts keine simple Lösung - hier auch nicht.
    Du willst hier ein eigenes Datenübertragungs-Protokoll schreiben und Informationen einer Klasse per Stream übertragen. Das ist definitiv keine einfacher Aufgabe und eine simple Lösung wirds auch nicht geben. Du jagst auf der einen Seite des Streams ein ByteArray (erzeugt von einer Klasseninstanz) rein und fischst es auf der anderen Seite wieder raus und machst wieder eine Instanz daraus.

    @Alle Anderen
    mit Pakete meint er diese Informationshäppchen (Datums, Strings, etc). Der Leser des Streams muss ja wissen worum es sich handelt und wie er die Daten interpretieren muss. Darum ein Header der sagt was da jetzt ankommt und dann erst die Daten. Das Ganze Gebilde nennt er "Packet" und hat nichts mit dem TCP-Packen zutun.

    @ErfinderDesRades
    Und wenn er mehrere (verschiedene) Klassen übertragen will. Woher weiß die Gegenseite dann worum es sich handelt?

    Dafür würde ich den "Header" benutzen
    ID + Datenlänge + Daten

    wäre z.B. ein schöner Aufbau für so eine Übertragungsfolge. Dann weiß man anhand der ID es handelt sich um Klasse xy und die Klasse wurde zu n Bytes serialisiert. Also einfach die nächsten n Bytes lesen und zurückserialisieren. Dann die nächsten Infos abwarten...