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 :

envoi de paquet tcp linux


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Octobre 2010
    Messages
    112
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 112
    Par défaut envoi de paquet tcp linux
    bonjour,

    je tourne sous linux, le problème est lorsque je compile, le message errorn apparrait plein de fois,je débute en programmation réseaux si vous pouvez m'aider car j'arrive pas à envoyer un paque tcp, je pense que le problème vient lors de l'envoie du paquet(dans la boucle à la fin du code)

    J'espère avoir été compréhensible je vous passe le code ci-joint,

    merci

    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
    #include<stdio.h>
    #include<netinet/tcp.h> //Provides declarations for tcp header
    #include<netinet/ip.h> //Provides declarations for ip header
    #include <string.h>
    //Checksum calculation function
    unsigned short csum (unsigned short *buf, int nwords)
    {
     unsigned long sum;
     
     for (sum = 0; nwords > 0; nwords--)
      sum += *buf++;
     
     sum = (sum >> 16) + (sum & 0xffff);
     sum += (sum >> 16);
     
     return ~sum;
    }
     
    int main (void)
    {
     //Create a raw socket
     int s = socket (PF_INET, SOCK_RAW, IPPROTO_TCP);
     //Datagram to represent the packet
     char datagram[4096];
     //IP header
     struct iphdr *iph = (struct iphdr *) datagram;
     //TCP header
     struct tcphdr *tcph = (struct tcphdr *) (datagram + sizeof (struct ip));
     struct sockaddr_in sin;
     
     sin.sin_family = AF_INET;
     sin.sin_port = htons(40);
     sin.sin_addr.s_addr = inet_addr ("74.125.39.104");
     
     memset (datagram, 0, 4096); /* zero out the buffer */
     
     //Fill in the IP Header
     iph->ihl = 5;
     iph->version = 4;
     iph->tos = 0;
     iph->tot_len = sizeof (struct ip) + sizeof (struct tcphdr);
     iph->id = htonl (54321); //Id of this packet
     iph->frag_off = 0;
     iph->ttl = 255;
     iph->protocol = 6;
     iph->check = 0;  //Set to 0 before calculating checksum
     iph->saddr = inet_addr ("xx.xx.xx.xx"); //Spoof the source ip address
     iph->daddr = sin.sin_addr.s_addr;
     
     //TCP Header
     tcph->source = htons (1234);
     tcph->dest = htons (85);
     tcph->seq = random ();
     tcph->ack_seq = 0;
     tcph->doff = 0;  /* first and only tcp segment */
     tcph->syn = 1;
     tcph->window = htonl (65535); /* maximum allowed window size */
     tcph->check = 0;/* if you set a checksum to zero, your kernel's IP stack
        should fill in the correct checksum during transmission */
     tcph->urg_ptr = 0;
     //Now the IP checksum
     iph->check = csum ((unsigned short *) datagram, iph->tot_len >> 1);
     
     //IP_HDRINCL to tell the kernel that headers are included in the packet
     {
      int one = 1;
      const int *val = &one;
      if (setsockopt (s, IPPROTO_IP, IP_HDRINCL, val, sizeof (one)) < 0)
       printf ("Warning: Cannot set HDRINCL!n");
     }
     
     while (1)
     {
      //Send the packet
      if (sendto (s,  /* our socket */
         datagram, /* the buffer containing headers and data */
         iph->tot_len, /* total length of our datagram */
         0,  /* routing flags, normally always 0 */
         (struct sockaddr *) &sin, /* socket addr, just like in */
         sizeof (sin)) < 0)  /* a normal send() */
       printf ("errorn");
      else
       printf (".");
     }
     
     
    }

  2. #2
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 484
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 484
    Par défaut
    Il n'y a qu'un seul endroit dans ton programme où tu écris « errorn », c'est à la ligne 81 de l'extrait que tu nous as donné.

    Si tu utilisais « perror() » plutôt que « printf() », tu obtiendrais en toutes lettres le message de l'erreur qui se produit. Chez moi, j'obtiens « Bad file descriptor », ce qui correspond à EBADF et qui signifie généralement que le socket que tu as précisé n'est pas valide.

    Au point de vue du C, le code est valide, mais le socket a de toute évidence été mal initialisé. Tu as fait des appels plus haut pour le faire, mais sans vérifier s'ils réussissaient.

  3. #3
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juin 2011
    Messages : 1 091
    Billets dans le blog
    1
    Par défaut
    Je pense qu'il y a un truc manquant dans ton code: le connect, sans ça ton socket n'est relié à rien.

    Ensuite tu es sur que c'est sur le port 40 que tu te connecte? Car si je me souviens bien les ports entre 1 et 1024 sont réservés pour le système.

  4. #4
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 29
    Par défaut
    Salut,

    Car si je me souviens bien les ports entre 1 et 1024 sont réservés pour le système.
    Ces ports ne sont pas réservés au système, on peut tout à fait les utiliser, simplement il faut les privilèges du superutilisateur. Donc avant d’exécuter le programme il faudra faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    gcc -o nom_programme nom_programme.c
    sudo chown root ./nom_programme
    sudo chmod u+s ./nom_programme
    puis

    pour le lancer.

    Sans les deux commandes après gcc, il sera impossible de faire tourner correctement le programme.

    Cordialement,

    Pop360

  5. #5
    Membre éclairé
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2011
    Messages
    29
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2011
    Messages : 29
    Par défaut
    Oups, je n'avais pas vu la date du dernier post Je pense que ç'est déja résolu du coup

Discussions similaires

  1. [Socket] Envoie d'un paquet TCP
    Par raphui dans le forum Réseau
    Réponses: 3
    Dernier message: 18/11/2011, 12h32
  2. envoi de paquets UDP par wifi
    Par gdpasmini dans le forum Développement
    Réponses: 4
    Dernier message: 08/11/2006, 19h15
  3. Envoi de paquet SYN
    Par Pragmateek dans le forum C++
    Réponses: 5
    Dernier message: 22/03/2006, 14h20
  4. echange de paquets (tcp)
    Par cortex024 dans le forum Développement
    Réponses: 1
    Dernier message: 03/10/2005, 21h40
  5. Programme permettant de créer ses propres paquets TCP/UDP
    Par mat087 dans le forum Développement
    Réponses: 6
    Dernier message: 21/05/2004, 21h42

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