[VB] TCP Packet als Bytes senden

04/23/2014 22:05 ravvon#1
Guten Abend,
ich versuche einem Server per TCP ein Packet für einen Request von meinen Accountdaten zu schicken, die benötigten Packets habe ich bereits gefiltert, analysiert und nachgebaut, einziges Problem ist, der Header des Packets, welches ich an den Server schicke ist ein Kauderwelsch wenn ich ihn als Ascii oder Dezimalzahl darstelle, das heißt er muss als ein Bytearray verschickt werden.

Mein Problem ist jetzt, dass die anderen Daten als String gespeichert werden und ich zwar die einzelnen Strings in Bytearrays formatieren kann, jedoch schlagen alle Versuche fehl das ganze in ein großes Packet zu stopfen und zu verschicken.
Ich habe sowieso irgendwie das Gefühl ich benutze hier die Holzhammermethode und es geht eigentlich viel viel eleganter, ich weiß nur nicht wie.

Also falls jemand irgendwie nen Ansatz für mich hat wie ich das ganze eleganter lösen könnte würde ich mich wirklich freuen.

Nachdem ich meinen Code hier nochmal angeschaut habe bete ich um einen eleganteren Lösungsweg. ;D

Hier noch der relevante Code und Ablauf wie ich das Packet zusammenstelle:
Code:
Dim account As String //wichtige Daten für das Packet
Dim agent As String

//Funktion um String in ein Bytearray zu encoden
Public Function TextStringToByteArray(ByRef str As String) As Byte()
        Dim enc As System.Text.Encoding = System.Text.Encoding.Default

        Return enc.GetBytes(str)
End Function

//Funktion die das fertige Packet baut
Private Function buildPacket()
        Dim message As Byte() = {"01,81"} //zu verschickende Nachricht, Header als Startwert
        Dim b_account as Byte() = TextStringToByteArray(account)
        Dim b_agent as Byte() = TextStringToByteArray(agent)

        //Zusammenfügen der Arrays
        Array.Resize(message, message.Length + b_account.Length)
        Array.Copy(b_account, 0, message, message.Length - b_account.Length, b_account.Length)
        Array.Resize(message, message.Length + b_agent.Length)
        Array.Copy(b_agent, 0, message, message.Length - b_agent.Length, b_agent.Length)

        //return message

        //Ausgabe meines Arrays als String zur Überprüfung
        Dim strf As String = ""
        For Each b As Byte In b_length
            strf = strf + b.ToString("x").ToUpper
        Next
        Return strf
End Function
04/24/2014 12:41 x]vIrus[x#2
schon mal dran gedacht, dass das, was du mit deinem packet editor als string siehst gar keine strings sind? sondern bytes?
warum verschickst du dann deine bytes als string?

du kannst auch mehrere byte arrays senden, du musst diese nicht erst in ein array packen
PHP Code:
    Dim arrMsg As Byte() = { &H01, &H81, ... }
    
Dim arrAccount As Byte() = { &H01, &H81, ... }
    
Dim arrAgent As Byte() = { &H01, &H81, ... }

    
Using tcpClient As New System.Net.Sockets.TcpClient()
        
tcpClient.Connect("127.0.0.1"10001)
        
Using s As System.Net.Sockets.NetworkStream tcpClient.GetStream()
            
s.Write(arrMsg 0arrMsg .Length)
            
s.Write(arrAccount 0arrAccount .Length)
            
s.Write(arrAgent 0arrAgent .Length)
            
vielleicht noch s.Flush()
        
End Using 'Verbindung schließen
    End Using 
04/24/2014 19:23 ravvon#3
Ja das gleich alles als Bytearrays zu definieren wäre eine Idee, aber da die Strings dynamisch sind und erst während dem Login aus einer Quelldatei ausgelesen werden kann ich die leider nicht vorher definieren.
Aber dafür hat mir deine Version eines TCP Clients sehr geholfen, wusste nicht das man die ganzen Daten auch einzeln senden kann, ist natürlich viel angenehmer als alles zusammenzufügen.

Mfg ravvon
04/25/2014 13:09 x]vIrus[x#4
dann poste doch mal mehr code, anhand deines schnipsels geht das nicht hervor