Socket Raw

M5i9k Messages postés 49 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 10 novembre 2007 - 19 mars 2006 à 23:30
M5i9k Messages postés 49 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 10 novembre 2007 - 26 mars 2006 à 16:33
Bonjour,
J'essaye de comprendre le fonctionnement des sockets raw,
je dois donc fournir une en-tête IP, j'utilise une structure mais je ne
sais pas quels champs je dois fournir. Est-ce que quelqu'un aurait une
suggestion? Est-ce que je dois fournir cet en-tête lors d'un
Send() ou avec SetSocketOption() ?

1 réponse

M5i9k Messages postés 49 Date d'inscription mardi 22 novembre 2005 Statut Membre Dernière intervention 10 novembre 2007
26 mars 2006 à 16:33
Apres plusieurs essais j'ai trouvé ce qu'il faut, cependant j'ai un autre problème :
Pour un paquet udp, le checksum se calcule grâce à une pseudo en-tête ip qui contient l'ip source et destination un zéro, le protocol supérieur utilisé et la taille du paquet udp,
j'ai écrit un fonction qui permet de le calculer à partir d'un paquet udp sans données (c'est un peu le bordel lol) mais c'est juste pour l'essai :

unsafe static void Main(string[] args)
{
byte[] packet=new byte[]{15000>>8,15000&0xff,14000>>8,14000&0xff};
// [ port source (16 bits), port dest (16 bits) ]

byte[] pseudo_h=new byte[]{192,168,0,1,192,168,0,2,0,11,0,8};
// [ Ip1, Ip2, 0, proto (udp= 11), UdpLen (16 bits)

byte[] test=new byte[packet.Length+pseudo_h.Length];
Array.Copy(pseudo_h,0,test,0,pseudo_h.Length);
Array.Copy(packet,0,test,pseudo_h.Length,packet.Length);

// Pour afficher le tableau en hexa
for(int j=0; j < test.Length;j++)
{
Console.Write("{0:x} ",test[j]);
}

int i=test.Length-1;
long chksum=0;
fixed(byte* b=test)
{
while(i>0)
{
ushort us=(ushort)((((ushort)*(b+i-1))<<8)+((ushort)*(b+i)));
i=i-2;
chksum +=us;
}
if(i==0)
chksum+=(ushort)(test[0]);
}
chksum = (chksum >> 16)+(chksum & 0xffff);
chksum += chksum >> 16;
chksum = ~chksum;
Console.WriteLine("Valeur du checksum : {0:x}",((ushort)chksum));
}

je n'arrivais pas à trouvé comment utiliser un pointeur de type ushort avec un tableau de byte, donc j'ai utilisé un pointeur byte.
Cette fontion me renvoi un valeur de 0x0D50, la vraie valeur du checksum devrait être 0x0D42. Il doit manquer une donnée... Si queulqu'un pourrait m'aider plz
0
Rejoignez-nous