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 :

problème de destPort (UDP) programmation socket


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 15
    Par défaut problème de destPort (UDP) programmation socket
    Bonjour à tous

    Voila je vous explique mon problème: j'utilise libnetfilter_queue pour capturer des paquet dans des queues(sans blague), j'en extrait ensuite le payload grâce a la fonction nfq_get_payload() (un truc du genre).
    celui ci contient struct iphdr + une struct udphdr + la data (pour moi une chaine de caractére) jusque la c'est bon...
    ensuite je change l'adresse ip de destination (elle est vers 192.6.1.237 quand je la reçois et je la change en 192.6.1.236) je change également le destport dans l'entête udp MAIS... il le port ne se change pas... il reste a la valeur qu'il était lorceque j'ai reçu le paquet, je ne comprend pas pourquoi rien n'y fait...

    voilà la fonction qui est appellé par la fonction callback:

    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
    static void build_copy_pkt (unsigned char *data)
    {
        int one = 1;
        const int *val = &one;
     
        int numbytes;
        int sockfd, optval;
        unsigned char *cpy_data = data;
     
        struct iphdr *ip_hdr;
        struct udphdr *udp_hdr;
        ip_hdr=(struct iphdr *)cpy_data;
    //tcp_hdr=(struct tcphdr *)(cpy_data + (sizeof(struct iphdr)));
        if(ip_hdr->protocol == IPPROTO_UDP)
        {
            udp_hdr = ((struct udphdr *)cpy_data) + (sizeof (struct iphdr));
     
        }
        struct sockaddr_in dconn;
        char test[16], test2[16];
     
        udp_hdr->dest = htons(51064);
        inet_pton(AF_INET, "192.6.1.236", &ip_hdr->daddr);
     
        printf("Création du socket\n");
        sockfd = socket(AF_INET, SOCK_RAW, IPPROTO_UDP);
        if(sockfd <0)
        {
            printf("erreur durant la création du socket");
        }
     
        dconn.sin_port  = htons(51064);
        dconn.sin_family = AF_INET;
        dconn.sin_addr.s_addr = ip_hdr->daddr;
     
        printf("protocol : %d\n", ip_hdr->protocol);
        printf("ttl: %d\n", ip_hdr->ttl);
        inet_ntop(AF_INET, &(ip_hdr->saddr), test, sizeof(test));
        printf("source : %s\n", test);
        inet_ntop(AF_INET, &(ip_hdr->daddr), test2, sizeof(test2));
        printf("destination : %s\n", test2);
     
     
        ip_hdr->tot_len= sizeof(struct iphdr)+ sizeof(struct udphdr) +10;
        printf("tot len : %d\n", ip_hdr->tot_len);
     
        printf("ip_len: %d\n", sizeof(ip_hdr));
        printf("payload : %d \n", sizeof(cpy_data));
        printf("payload value: %s\n", cpy_data);
     
     
        printf("dport : %d\n\n", ntohs(udp_hdr->dest));
        udp_hdr->source = htons(2102);
        printf("sport : %d\n\n", ntohs(udp_hdr->source));
        udp_hdr->len = sizeof(struct udphdr) + 11;//+ sizeof(ip_hdr));
     
     
        if (setsockopt (sockfd, IPPROTO_IP, IP_HDRINCL, val, sizeof (one)) < 0)
        {
            printf ("Warning: Cannot set HDRINCL!\n");
        }
     
        numbytes=sendto(sockfd, cpy_data,ip_hdr->tot_len, 0,(struct sockaddr *)&dconn, sizeof(struct sockaddr));
        if(numbytes <0)
        {
            printf("erreur durant l'envoi \n");
            exit(1);
        }
        printf("pkt sent : %d", numbytes);
     
     
    }

    merci de votre aide

  2. #2
    Membre très actif

    Femme Profil pro
    Collégien
    Inscrit en
    Juillet 2010
    Messages
    591
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Afghanistan

    Informations professionnelles :
    Activité : Collégien

    Informations forums :
    Inscription : Juillet 2010
    Messages : 591
    Par défaut
    Salut,
    Question à 2 balles:
    Es-tu sure que data pointe sur un espace mémoire qui existe? qui est alloué ? et suffisamment grand?

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Octobre 2013
    Messages
    15
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2013
    Messages : 15
    Par défaut
    re désolé du retard, merci de m'avoir répondu , j'ai finalement réussi, le problème venait de l'affectation de la variable udp_hdr pour l'entête UDP, j'avais tout bêtement fait une erreur de parenthèse, du coup je pense que le problème venait du fait que la taille allouée n'était pas la bonne, la solution est :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    udp_hdr = (struct udphdr *)(cpy_data + (sizeof (struct iphdr));
    ça marche super bien merci de vous être donné la peine de répondre

Discussions similaires

  1. Problème programmation Socket
    Par remirobert dans le forum Réseau
    Réponses: 2
    Dernier message: 12/06/2012, 08h43
  2. Programmation Socket : problème lors de l'envoie du fichier.
    Par WhiteTigerZ dans le forum Entrée/Sortie
    Réponses: 17
    Dernier message: 14/05/2011, 10h37
  3. Programmation socket UDP
    Par natanoj dans le forum C
    Réponses: 0
    Dernier message: 07/07/2008, 10h56
  4. Programmation socket: client UDP
    Par ThE_BuG87 dans le forum C++
    Réponses: 3
    Dernier message: 08/01/2007, 12h25
  5. [Réseau] Programmation socket
    Par raj dans le forum Entrée/Sortie
    Réponses: 6
    Dernier message: 03/12/2004, 12h58

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