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
Domanda n°1
Questa istruzione ricava dalla matrice la versione (“Heder”) la presente istruzione
come si interpreta ? perché c’è un valore esadecimale?
Domanda n°2
Questa istruzione ricava la lunghezza dell’ Heder come si interpreta?
Domanda n°3
Queste istruzioni non so a cosa servono e come si interpretano?
Domanda n°4
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
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