Oppure

Loading
25/02/11 11:49
Tipotalpo
Salve a tutti come un nuovo arrivato saluto tutti gli appassionati come me di programmazione.
Ho subito una domanda da fare spero che qualcuno mi sia di aiuto...ho letto
il regolamento del forum e non penso di trasgredire con questo messaggio.
Veniamo al dunque.
Ho iniziato da poco a studiare le Socket faccio un breve riassunto di cosa ho capito e cosa non ho capito.
Le socket vengono create in base al sistema operativo (io uso Windows) si
possono creare in più linguaggi (C/C++,vb.net,java..ecc) sfruttando le varie librerie indipendentemente dal linguaggio scelto si deve procedere prima alla
creazione del socket con gli adeguati parametri di configurazione,(famiglia indirizzi,tipo di socket,protocollo usato) e poi tramite le varie funzioni offerte in base alle impostazioni create precedentemente operare su di esso,per poter ricevere e mandare un flusso di byte.
Ho scaricato dalla rete un programma di esempio per studiarne il codice scritto in vb.net che appunto va a creare un Socket di tipo "RAW" funziona perfettamente ma chi lo ha creato non ha scritto nessun commento.
Aggiungo dicendo che ho due libri che parlano delle reti e protocolli me li sono studiati per bene senza parlare delle ricerche fatte su internet ho delle basi sul linguaggio c/c++ e dell'assembrer ma lo stesso non riesco a capire il concetto....

Il punto che non riesco a capire come si fà ad analizzare il datagramma o meglio il flusso di byte scaricato riporto qui sotto il codice con le varie variabili dichiarate nel programma.
I punti che per mè sono critici sono contrassegnati dal punto di domanda”?” con la relativa domanda. Non pretendo mi sia scritto il codice ma almeno datemi uno spunto su dove mi devo
focalizzare per lo studio magari mettendone qualche link

'Variabili dichiarate
'----------------------------------------------------

    Private m_Raw() As Byte
    Private m_Time As DateTime
    Private m_Version As Integer
    Private m_HeaderLength As Integer
    Private m_Precedence As Precedence
    Private m_Delay As Delay
    Private m_Throughput As Throughput
    Private m_Reliability As Reliability
    Private m_TotalLength As Integer
    Private m_Identification As Integer
    Private m_TimeToLive As Integer
    Private m_Checksum() As Byte
    Private m_SourceAddress As String
    Private m_DestinationAddress As String
    Private m_SourcePort As Integer
    Private m_DestinationPort As Integer


'--------------------------------------------------------------------
'--------------------------------------------------------------------

'Sub che analizza il pacchetto
        If raw Is Nothing Then Throw New ArgumentNullException

        If raw.Length < 20 Then Throw New ArgumentException


        m_Raw = raw  
        m_Time = time
        m_Version = (raw(0) & &HF0) >> 4           ‘?????????????? Domanda n°1
        m_HeaderLength = (raw(0) And &HF) * 4 ‘?????????????? Domanda n°2

        If (raw(0) And &HF) < 5 Then Throw New ArgumentException

        m_Precedence = ((raw(1) And &HE0) >> 5) ‘?????????????” Domanda n°3
        m_Delay = ((raw(1) And &H10) >> 4)          ‘?????????????” Domanda n°3
        m_Throughput = ((raw(1) And &H8) >> 3)  ‘?????????????” Domanda n°3
        m_Reliability = ((raw(1) And &H4) >> 2)    ‘?????????????” Domanda n°3
        m_TotalLength = raw(2) * 256 + raw(3)      ‘?????????????” Domanda n°4

        If Not m_TotalLength = raw.Length Then Throw New ArgumentException ' invalid size 
       of  packet


        m_Identification = raw(4) * 256 + raw(5)

        m_TimeToLive = raw(8)

        'if (Enum.IsDefined(typeof(Protocol),  raw(9)))
        m_Protocol = raw(9)
        'Else
        'm_Protocol = Protocol.Other
        'END IF 

        ReDim m_Checksum(2)
        m_Checksum(0) = raw(11)
        m_Checksum(1) = raw(10)

       
        Try
            m_SourceAddress = GetIPAddress(raw, 12)
            m_DestinationAddress = GetIPAddress(raw, 16)
        Catch ex As Exception
            'MsgBox(ex.Message)
        End Try

        If m_Protocol = Protocol.Tcp Or m_Protocol = Protocol.Udp Then
            m_SourcePort = raw(m_HeaderLength) * 256 + raw(m_HeaderLength + 1)
            m_DestinationPort = raw(m_HeaderLength + 2) * 256 + raw(m_HeaderLength + 3)
        Else
            m_SourcePort = -1
            m_DestinationPort = -1
      End If


Domanda n°1
m_Version = (raw(0) & &HF0) >> 4

Questa istruzione ricava dalla matrice la versione (“Heder”) la presente istruzione
come si interpreta ? perché c’è un valore esadecimale?

Domanda n°2
m_HeaderLength = (raw(0) And &HF) * 4

Questa istruzione ricava la lunghezza dell’ Heder come si interpreta?

Domanda n°3
m_Precedence = ((raw(1) And &HE0) >> 5)
m_Delay = ((raw(1) And &H10) >> 4)  
m_Throughput = ((raw(1) And &H8) >> 3)
m_Reliability = ((raw(1) And &H4) >> 2)

Queste istruzioni non so a cosa servono e come si interpretano?

Domanda n°4
m_TotalLength = raw(2) * 256 + raw(3)

Questa istruzione verifica la lunghezza totale per poi confrontarla con il pacchetto scaricato e quindi ne verifica se ci sono errori.

Domanda n°5
Una volta ottenuto la lunghezza totale dell’ heder di intestazione del protocollo posso ricavare il Byte di inizio dati ma i dati nella matrice sono in formato integer come si deve fare per ricavarne il contenuto codificandolo in ASCHI e quindi leggibile?
Nel programma tali dati vengono inseriti in un oggetto “ StringBuilder “ ma i
valori sono in esadecimale come posso codificarli in ASCII ?
Riporto qui sotto la funzione con l’oggetto StringBuilder
Public Function ToString(ByVal RawData As Boolean) As String
        Dim sb As StringBuilder = New StringBuilder(Raw.Length)
        Dim i As Integer, j As Integer

        If RawData Then
            For i = 0 To Raw.Length - 1
                If Raw(i) > 31 Then
                    sb.Append(Raw(i))
                Else
                    sb.Append(".")
                End If
            Next
        Else
            Dim rawString As String = ToString(True)
            For i = 0 To Raw.Length - 1 Step 16
                For j = i To Raw.Length - 1 And j < i + 16

                 sb.Append(Raw(j).ToString("x2") + " ") ‘Questa è l’istruzione

                Next
            Next

            If rawString.Length < i + 16 Then
                sb.Append(" ", ((16 - (rawString.Length Mod 16)) Mod 16) * 3)
                sb.Append(" " + rawString.Substring(i) + vbCrLf)
            Else
                sb.Append(" " + rawString.Substring(i, 16) + "\r\n")
            End If

        End If

        Return sb.ToString()
    End Function
Ultima modifica effettuata da Il Totem 26/02/11 10:03
aaa
26/02/11 10:15
Il Totem
1. Se hai studiato il formato del datagramma dovresti sapere meglio di me, che non lo conosco affatto, che la versione è codificata nei primi 4 bit del primo byte. Infatti raw(0) And &HF0, annulla gli ultimi quattro bit e lo shift verso destra sposta tutti i bit a destra di quattro posizioni. Quindi se raw(0) è bbbbaaaa, il risultato sarà codificato dai bit bbbb. In realtà usare l'and è inutile, perché i 4 bit vanno persi comunque.
2. Stessa storia di prima, ma ottiene gli ultimi quattro bit, e moltiplica il risultato per quattro. Ad esempio, se il primo byte è 0xA7 = 0b10100111, il numero di versione sarà 0b1010 = 10, mentre la lunghezza dell'header, in parole da 4 byte, sarà 0b0111 = 7 (ossia 28 byte).
3, 4. Come sopra.

5. Il codice che hai postato fa proprio quello che hai chiesto. Che problema c'è?
aaa
26/02/11 10:41
Tipotalpo
Grazie per essere intervenuto Totem il concetto che non riuscivo a capire ora
è molto più chiaro il mio errore stava appunto nel ricercare il valore nei primi
bit ragionavo...... in byte.
Confermo alla tua risposta che si include su un documento da me trovato in
rete in lingua Inglese e tradotto in Italiano.
Se sei d'accordo visto che sei il moderatore del sito se non l'amministratore lo
pubblico altrimenti la finiamo qui.
Grazie per l'aiuto.:)
aaa
27/02/11 11:16
Il Totem
Cosa vuoi pubblicare, il documento o il programma?

N.B.: sono un amministratore del sito, benché il tag dica ancora Founder Member.
aaa