Pour les trames UDP, tu peux le faire avec un truc de ce genre:
voidcapture(pcap_t*p){structpcap_pkthdrhdr;constunsignedchar*pload;conststructethhdr*ethhdr;conststructiphdr*iphdr;conststructudphdr*udphdr;constunsignedchar*data;structin_addrinaddr;constintmin_size=sizeofethhdr[0]+sizeofiphdr[0]+sizeofudphdr[0];intdata_len;structpcap_buff*b;intseqnum;seqnum=0;for(;;){seqnum++;pload=pcap_next(p,&hdr);if(pload==NULL)break;if(hdr.caplen!=hdr.len){fprintf(stderr,"[%d] capture was truncated (%d expected, %d captured)\n",seqnum,hdr.len,hdr.caplen);continue;}if(hdr.len<min_size){fprintf(stderr,"[%d] Too small frame found (%d < %d)\n",seqnum,hdr.len,min_size);continue;}ethhdr=(structethhdr*)pload;if(ethhdr->h_proto!=htons(ETH_P_IP)){fprintf(stderr,"[%d] Unknown ethhdr->h_proto (%04x)\n",seqnum,ethhdr->h_proto);continue;}iphdr=(structiphdr*)(pload+sizeofethhdr[0]);if(iphdr->ihl!=sizeofiphdr[0]/4){fprintf(stderr,"[%d] Invalid iphdr->ihl (%d != %d)\n",seqnum,iphdr->ihl*4,sizeofiphdr[0]);continue;}if(iphdr->protocol!=IPPROTO_UDP){fprintf(stderr,"[%d] Only UDP is allowed (%#x found)\n",seqnum,iphdr->protocol);continue;}udphdr=(structudphdr*)(pload+sizeofethhdr[0]+sizeofiphdr[0]);data_len=htons(udphdr->len)-sizeofudphdr[0];if(data_len+min_size!=hdr.len){fprintf(stderr,"[%d] Invalid pload lenght ((%d - %d) + %d != %d)\n",seqnum,htons(udphdr->len),sizeofudphdr[0],min_size,hdr.len);continue;}data=pload+sizeofethhdr[0]+sizeofiphdr[0]+sizeofudphdr[0];inaddr.s_addr=iphdr->saddr;printf("[%d] ip.saddr = <%s>, udp.source = <%d>\n",seqnum,inet_ntoa(inaddr),htons(udphdr->source));inaddr.s_addr=iphdr->daddr;printf("[%d] ip.daddr = <%s>, udp.dest = <%d>\n",seqnum,inet_ntoa(inaddr),htons(udphdr->dest));}}
À la fin de la boucle:
* iphdr pointe sur l'entête IP (où tu trouveras entre autre la source et destination ainsi que le type UDP, TCP etc.)
* udphdr pointe sur l'entête UDP (où tu trouveras entre autre les ports source et destination)
* data pointe sur les données (sic !)
Si tu veux les ports TCP dans le cas des paquets TCP, tout comme l'entête UDP, pointer avec un struct udphdr et y lire "source" et "dest". Faut juste faire gaffe aux histoires d'offset pour la donnée, et aux htons des champs dans les structures.
[^] # Re: Pas le but de libpcap
Posté par ninis666 . En réponse au message Le port source avc LIbpcap. Évalué à 0.
Pour les trames UDP, tu peux le faire avec un truc de ce genre:
À la fin de la boucle:
* iphdr pointe sur l'entête IP (où tu trouveras entre autre la source et destination ainsi que le type UDP, TCP etc.)
* udphdr pointe sur l'entête UDP (où tu trouveras entre autre les ports source et destination)
* data pointe sur les données (sic !)
Si tu veux les ports TCP dans le cas des paquets TCP, tout comme l'entête UDP, pointer avec un struct udphdr et y lire "source" et "dest". Faut juste faire gaffe aux histoires d'offset pour la donnée, et aux htons des champs dans les structures.