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 :

Trame IP RAW


Sujet :

Réseau C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut Trame IP RAW
    Salut,

    J'essaie d'envoyer une trame ip en C, mais le format TCP n'a pas l'air bon (pourtant j'ai l'impression d'avoir bien mis tous les champs au bon endroit...).

    Voici le problème (dans wireshark):
    http://img166.imageshack.us/img166/2989/iptcpdn7.png

    Et voici le 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
    #include <arpa/inet.h>
    #include <string.h>
    #include <stdio.h>
     
    typedef struct ipheader {
    	unsigned char hl:4, v:4; /* this means that each member is 4 bits */
    	unsigned char tos;
    	unsigned short int len;
    	unsigned short int id;
    	unsigned short int off;
    	unsigned char ttl;
    	unsigned char p;
    	unsigned short int sum;
    	unsigned int src;
    	unsigned int dst;
    } * t_ipheader; /* total ip header length: 20 bytes (=160 bits) */
     
    typedef struct tcpheader {
    	unsigned short int sport;
    	unsigned short int dport;
    	unsigned int seq;
    	unsigned int ack;
     	unsigned char x2:4, off:4;
    	unsigned char flags;
    	unsigned short int win;
    	unsigned short int sum;
    	unsigned short int urp;
    } * t_tcpheader; /* total tcp header length: 20 bytes (=160 bits) */
     
    void fill_ipheader(t_ipheader header) {
    	//t_ipheader header = (t_ipheader) malloc(sizeof(ipheader));
    	header -> hl = 5; // header is 5 * 32 bits
    	header -> v = 4; // ip v4
    	header -> tos = 0; // type of service, don't care
    	header -> len = sizeof(struct ipheader) + sizeof(struct tcpheader);
    	header -> id = 0; // id, don't care
    	header -> off = 0; // first fragment
    	header -> ttl = 1; // on lan, 1 router, which provide wifi
    	header -> p = 6; // tcp protocol;
    	header -> sum = 0;
    	header -> src = inet_addr("192.168.0.1");
    	header -> dst = inet_addr("192.168.0.1");
    }
     
    void fill_tcpheader(t_tcpheader header) {
    	//t_tcpheader header = (t_tcpheader) malloc(sizeof(tcpheader));
    	header -> sport = 1863;
    	header -> dport = 59575;
    	header -> seq = 127;
    	header -> ack = 0;
    	header -> x2 = 0;
    	header -> off = 0x8;
    	header -> flags = 18;
    	header -> win = 0xfd91;
    	header -> sum = 0;
    	header -> urp = 0;
    }
     
    int main() {
    	int s = socket (PF_INET, SOCK_RAW, IPPROTO_TCP);
    	char datagram[4096];
    	memset (datagram, 0, 4096);
    	fill_ipheader((t_ipheader)datagram);
    	fill_tcpheader((t_tcpheader)(datagram + sizeof(struct ipheader)));
     
    	char* offset = datagram + sizeof(struct ipheader) + sizeof(struct tcpheader);
    	offset[0] = 5;
     
    	struct sockaddr_in sin;
     
    	sin.sin_family = AF_INET;
    	sin.sin_port = htons (1863);
    	sin.sin_addr.s_addr = inet_addr ("192.168.0.1");
     
     {				/* lets do it the ugly way.. */
        int one = 1;
        const int *val = &one;
        if (setsockopt (s, IPPROTO_IP, IP_HDRINCL, val, sizeof (one)) < 0)
          printf ("Warning: Cannot set HDRINCL!\n");
      }
     
    	if (sendto (s, datagram, ((t_ipheader)datagram)->len, 0,
    	    		(struct sockaddr *) &sin, sizeof (sin)) < 0)	
    		printf ("error\n");
    	else
    		printf (".");
     
    }

  2. #2
    Membre émérite
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Par défaut
    Euh, déjà les ports ne sont pas bon. Tu as du oublier les ntohs() et ntohl() et etre sur une machine Little Endian (genre x86)

  3. #3
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par D[r]eadLock Voir le message
    Euh, déjà les ports ne sont pas bon. Tu as du oublier les ntohs() et ntohl() et etre sur une machine Little Endian (genre x86)
    OK j'ai mis htons et là les ports sont bons... Par contre j'ai toujours "Malformed Packet TCP"...

  4. #4
    Membre émérite
    Avatar de D[r]eadLock
    Profil pro
    Inscrit en
    Mai 2002
    Messages
    504
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France

    Informations forums :
    Inscription : Mai 2002
    Messages : 504
    Par défaut
    T'as capturé une trame TCP correcte pour voir la différence avec la tienne (genre avec un connect) ?
    Où wireshark donne-t-il encore l'erreur ?
    Vite fait, je dirait que ton 80 (notemment le off devrait etre a 5 et non 8).

  5. #5
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par D[r]eadLock Voir le message
    T'as capturé une trame TCP correcte pour voir la différence avec la tienne (genre avec un connect) ?
    Où wireshark donne-t-il encore l'erreur ?
    Vite fait, je dirait que ton 80 (notemment le off devrait etre a 5 et non 8).
    Oulà, bien vu !
    Ça marche avec 5... merci !

    En fait pour remplir les champs, j'ai capturé un paquet TCP et j'ai mis les mêmes valeurs un peu partout, mais c'est vrai que vu qu'il n'y a pas de data sur mon test, la taille n'est pas bonne

  6. #6
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par ®om Voir le message
    En fait pour remplir les champs, j'ai capturé un paquet TCP et j'ai mis les mêmes valeurs un peu partout, mais c'est vrai que vu qu'il n'y a pas de data sur mon test, la taille n'est pas bonne
    Bref, tu n'as rien compris à ce qu'est une trame TCP/IP... C'est pourtant pas compliqué :

    http://www.frameip.com/rfc/

    cesse de programmer au hasard...

  7. #7
    Membre Expert
    Avatar de ®om
    Profil pro
    Inscrit en
    Janvier 2005
    Messages
    2 815
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2005
    Messages : 2 815
    Par défaut
    Citation Envoyé par Emmanuel Delahaye Voir le message
    Bref, tu n'as rien compris à ce qu'est une trame TCP/IP... C'est pourtant pas compliqué :

    http://www.frameip.com/rfc/

    cesse de programmer au hasard...
    Mais si je sais ce que c'est qu'une trame tcp ou une trame ip... C'est juste que là je voulais simplement tester l'envoi d'une socket ip, et après je mettrai les données dont j'ai besoin, là c'était juste pour voir si l'envoi en raw ip marchait...
    Mais bon c'est vrai que j'avais pas mis les données au moment du débuggage, donc de ce fait évidemment la taille n'était pas bonne...

    Au passage, là j'ai trouvé comment envoyer une trame de niveau 3, comment faire en C pour envoyer une trame de niveau 2 (ethernet)?

  8. #8
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par ®om Voir le message
    Au passage, là j'ai trouvé comment envoyer une trame de niveau 3, comment faire en C pour envoyer une trame de niveau 2 (ethernet)?
    Ce n'est pas une question de langage C.
    A ma connaissance, les sockets ne gèrent pas les niveaux < 3
    Ton système le fait peut être, mais probablement uniquement en mode kernel... Ce n'est donc pas à la portée du développeur d'application... Il faut voir les spécialistes de ton système.

    Pourquoi tu voudrais faire ça ? Le système le fait très bien... (Déjà, bricoler les entêtes TCP, je ne vois pas bien le but...)

Discussions similaires

  1. Réponses: 2
    Dernier message: 15/02/2010, 13h08
  2. Réponses: 15
    Dernier message: 04/01/2007, 11h15
  3. App Socket Raw avec VC++6
    Par Martin Soucy dans le forum Développement
    Réponses: 3
    Dernier message: 04/12/2002, 05h07
  4. raw socket et langage c
    Par SlayDave dans le forum Développement
    Réponses: 2
    Dernier message: 29/08/2002, 19h09
  5. lire une image au format RAW
    Par Anonymous dans le forum OpenGL
    Réponses: 5
    Dernier message: 20/05/2002, 00h11

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