2010-03-18 5 views
0

J'utilise pcap pour créer un renifleur de paquets.
i ont cette structure tcp:numéro de séquence d'impression d'un paquet reniflé

typedef struct TSP_header{ 
    unsigned short int sport; 
    unsigned short int dport; 
    unsigned int   seqnum; 
    unsigned int   acknum; 
    unsigned char  reserved:4, offset:4; 
    unsigned int 
    tcp_res1:4,  //little-endian 
    tcph_hlen:4,  //length of tcp header in 32-bit words 
    tcph_fin:1,  //Finish flag "fin" 
    tcph_syn:1,  //Synchronize sequence numbers to start a connection 
    tcph_rst:1,  //Reset flag 
    tcph_psh:1,  //Push, sends data to the application 
    tcph_ack:1,  //acknowledge 
    tcph_urg:1,  //urgent pointer 
    tcph_res2:2; 
    unsigned short int tcph_win; 
    unsigned short int tcph_chksum; 
    unsigned short int tcph_urgptr; 
}TSP_header;  

Comment imprimer le numéro de séquence?
devrais-je utiliser htons (sequence_number) ?? parce que ça ne marche pas de cette façon !!

mon autre question est quel est le nombre après la déclaration de variable?
ce que signifie 4 dans tcph_hlen: 4

Répondre

0

Si le langage de programmation est C, notez que votre structure est incorrecte car vous ne spécifiez pas la taille des champs. Par exemple, le numéro de séquence est de 32 bits et "int" peut être de 16 ou 64 bits. Pour seqnum, vous devriez utiliser uint32_t. Ceci étant dit, si vous avez lu le paquet TCP du réseau, le numéro de séquence est dans l'ordre du réseau (big-endian) et donc, pour l'imprimer, vous devez appeler ntohl (network to host - long) .

+0

Je ne pense pas que ntohl() fonctionne parce qu'il me donne une séquence négative et des numéros d'ack. – scatman

+0

ntohl prend un * entier non signé * comme paramètre et en résulte un entier * non signé *. Donc, à moins que vous n'ayez fait la grosse erreur de mettre le résultat de ntohl dans un * signed * int, les nombres négatifs ne peuvent pas arriver. Montrez votre code. – bortzmeyer

+0

Je vous donne un conseil utile: lisez la documentation. 'man 3 printf' vous dira que "d, i L'argument int est converti en notation décimale signée." Je vous laisse voir par vous-même ce qui est nécessaire pour un non signé. – bortzmeyer