IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Réseau C Discussion :

[Socket RAW] Problème entête UDP


Sujet :

Réseau C

  1. #1
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut [Socket RAW] Problème entête UDP
    Bonjour,
    j'ai quelques soucis avec les sockets raws, je veux envoyé une trame udp complète (dans le cadre d'un projet) mais définir moi même les entêtes (d'où mon choix pour les sock_raw).
    Normalement si je parle en terme de réseau je devrais avoir entête Ethernet -> entête Ip -> Entête UDP -> Data, ici l'entête Ethernet on n'y a pas accès ( si on se place dans le domaine AF_INET).
    Donc j'ai accès qu'au entête ip et udp, alors je rempli mes entêtes ip et udp, et lors de l'envoi avec un sendto j'envoi mon paquet entier ( entêtes + data ).
    Et visiblement bah j'ai pas l'entête UDP que j'ai définit :s

    J'ai beau retourné le problème dans tout les sens, je vois plus.

    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
     
    /* Constantes */
    #define C_IP_DEST "192.168.145.128"
    #define C_IP_SRC "192.168.145.129"
    #define C_PORT 65000
    #define C_TAILLE_PAQUET 50
     
    /* Programme principal */
    int main(void)
    { 
     	/* Initialisation des variables */
    	int sock, optval,envoie;
            char *packet,*data;
     
            struct sockaddr_in peer;
            struct iphdr *ip;
    	struct udphdr *udp;
     
     
    	/* Allocation dynamique de la mémoire */
            ip 	= (struct iphdr *) malloc(sizeof(struct iphdr));//entete ip envoyer
            udp 	= (struct udphdr *) malloc(sizeof(struct udphdr));//entete udp envoyer
     
    	data	= (char *) malloc(C_TAILLE_PAQUET*sizeof(char));
            packet  = (char *) malloc(sizeof(struct iphdr) + sizeof(struct udphdr) + C_TAILLE_PAQUET*sizeof(char));
     
    	/* Paquet pointé sur les données à envoyer */
            ip = (struct iphdr *) packet;
    	udp = (struct udphdr *) (packet + sizeof(struct iphdr)); 
    	data = (char *) (packet  + sizeof(struct iphdr) + sizeof(struct udphdr));
     
     	 /* Création de la socket */
    	sock = socket(AF_INET,SOCK_RAW,IPPROTO_UDP);
           	if (sock<0)
    	{
    		printf("Erreur création de socket\n");
    		perror("Socket");
    		exit(1);
    	}
    	else 
    		printf ("Socket crée: \n");
     
     	/* Initialisation de la structure ip définie dans ip.h */
    	/**http://www.srcdoc.com/linux_2.2.26/linux_2ip_8h-source.html**/
            ip->ihl     	= 0x5;
            ip->version 	= 4;
            ip->tos     	= 0;
            ip->id      	= getuid();
            ip->ttl      	= 255;
            ip->tot_len 	= sizeof(struct iphdr) + sizeof(struct udphdr) + C_TAILLE_PAQUET*sizeof(char);
            ip->protocol 	= IPPROTO_UDP;
            ip->saddr    	= inet_addr(C_IP_SRC);
            ip->daddr    	= inet_addr(C_IP_DEST);
        	ip->frag_off 	= htons(0 >> 3);//on remplie l'offset decaler des 3bit de flag
    	ip->frag_off   |= 64;//on remplie le flag soit 64 soit htons(0x4000)
            ip->check    	= in_cksum((unsigned short *)icmp,sizeof(struct iphdr));
    	/* Remarque : L'utilisateur doit fournir une entête ip avant les données proprement dites. */
     
     	/* Initialisation de la structure udp définie dans udp.h */
    	/**http://www.srcdoc.com/linux_2.2.26/linux_2udp_8h-source.html**/
            udp->source     = htons(C_PORT);
            udp->dest 	= htons(C_PORT);
            udp->len    	= sizeof(struct udphdr) + C_TAILLE_PAQUET*sizeof(char);
            udp->check 	= 0;
     
    	/* Modification des paramètres de la socket */
            setsockopt(sock,IPPROTO_IP,IP_HDRINCL,&optval,sizeof(int));
     
    	/* Initialisation de la strcture sockaddr_in */
            peer.sin_family = AF_INET;
            peer.sin_addr.s_addr = inet_addr(C_IP_DEST);
            peer.sin_port = htons(C_PORT);
     
    	data = "Bonjour";
    	/**envoie de la requete*/
            envoie=sendto(sock,packet,ip->tot_len,0,(struct sockaddr *)&peer,sizeof(struct sockaddr));
     
    	/*controle l'envoie*/
           	if (envoie != ip->tot_len)
    		printf("A envoyé %d octets au lieu de %d octects\n",envoie,ip->tot_len);
    	else  
    		printf("%d octets envoyé (%d) données)\n",envoie, C_TAILLE_PAQUET);
     
          	if (envoie <= 0)
    		perror("Erreur sendto()");
     
    	printf("\n\n");
    	/* Libération des ressources */
            close(sock);
            free(packet);
            return 0;
    }
    Je n'ai pas mis la fonction in_cksum ni les includes qui ne sont pas utiles à la compréhension enfin je crois.

    Alors si il y a une âme charitable pour m'aider à comprendre pourquoi ça n'envoie pas l'entête udp :d

    Cordialement,
    POSTEL Edouard.

  2. #2
    Expert éminent
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Points : 8 389
    Points
    8 389
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ip->check = in_cksum((unsigned short *)icmp, sizeof(struct iphdr));
    icmp ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setsockopt(sock,IPPROTO_IP,IP_HDRINCL,&optval,sizeof(int));
    Mettre d'abord optval = 1;

  3. #3
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    pour la petite intrusion d'icmp c'est que j'essayais un peu tout et j'ai pas fait gaffe à remettre ip

    J'essaye de mettre optval à 1.

    Bon j'ai honte .. ça marche et en faites c'est même logique, je suis passé trop rapidement sur les bouts de codes que j'ai trouvé sur le net.

    A ajouter que pour udp->len, il faut également que ce soit en unsigned short et donc il faut utiliser htons(), je précise si ça peut aider des personnes par la suite

    Merci bien Melem !

  4. #4
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    Petite question, j'ai lu que l'on pouvait mettre le checksum udp à 0 que finalement ce n'étais pas important mais j'ai un doute en faîtes car je reçoit bien ma trame ip et udp mais après j'ai une entête Redback Lawful Intercept et encore un bout d'IP qui se rajoute ( toujours sous wireshark ).
    Visiblement c'est que sous wireshark cette entête Redback Lawful Intercept, mais j'ai pas compris à quoi elle correspond.

    Alors penses-tu que ça pourrait venir de là mes rajouts d'entêtes :s ?

  5. #5
    Futur Membre du Club
    Inscrit en
    Décembre 2008
    Messages
    6
    Détails du profil
    Informations forums :
    Inscription : Décembre 2008
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    En faites non le problème de viens pas de là, c'est qu'il n'y aucune data après mon entête udp, pourtant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    	data = (char *) (packet  + sizeof(struct iphdr) + sizeof(struct udphdr));
    Elle censé être stocké au même endroit que paquet entier ( décalé des entêtes bien sur ), mais quand je regarde la mémoire si j'écris dans data par exemple 'bonjour', celui-ci n'est pas dans le paquet, mais je vois pas où il est écris :s


    Edit :
    Il fallait utiliser strcpy(data, "Bnjour"); et non directement data = "Bonjour";

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probléme socket RAW
    Par Para_doxx dans le forum Réseau
    Réponses: 6
    Dernier message: 13/12/2013, 10h33
  2. Raw socket et problème d'endianness
    Par Eyyub dans le forum D
    Réponses: 0
    Dernier message: 04/02/2012, 11h45
  3. Réponses: 2
    Dernier message: 15/02/2010, 13h08
  4. Problème socket raw ? bizarre :~
    Par MonsieurAk dans le forum Windows
    Réponses: 2
    Dernier message: 12/07/2005, 14h12
  5. App Socket Raw avec VC++6
    Par Martin Soucy dans le forum Développement
    Réponses: 3
    Dernier message: 04/12/2002, 05h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo