begin process at 2008 08 22 04:48:46
1 229 775 membres
46 nouveaux aujourd'hui
14 267 membres club

Vous ne trouvez pas de réponse à votre problème ? Alors posez la question dans le forum.
Souvenez-vous qu'il n'y a jamais de question bête, mais rester dans l'ignorance parce que l'on n'ose pas poser une question, ça c'est une erreur !

Sujet : Socket Raw [ Archives / Réseau / Internet ] (M5i9k)

Socket Raw le 19/03/2006 23:30:49

M5i9k
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() ?

Re : Socket Raw le 26/03/2006 16:33:18

M5i9k
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


Classé sous : socket, tête, raw, fournir

Participer à cet échange

Pub



Appels d'offres

Snippets en rapport

CalendriCode

Août 2008
LMMJVSD
    123
45678910
11121314151617
18192021222324
25262728293031

Téléchargements

Logiciels à télécharger sur le même thème :

Boutique

Boutique de goodies CodeS-SourceS