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

  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 510
    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 510
    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, 13h32
  2. envoi de paquets UDP par wifi
    Par gdpasmini dans le forum D�veloppement
    R�ponses: 4
    Dernier message: 08/11/2006, 20h15
  3. Envoi de paquet SYN
    Par Pragmateek dans le forum C++
    R�ponses: 5
    Dernier message: 22/03/2006, 15h20
  4. echange de paquets (tcp)
    Par cortex024 dans le forum D�veloppement
    R�ponses: 1
    Dernier message: 03/10/2005, 22h40
  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, 22h42

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