<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
FONT-SIZE: 10pt;
FONT-FAMILY:Tahoma
}
</style>
</head>
<body class='hmmessage'>
I'm trying retrieve upd packets with pcap_next_ex but I compare the results with this example in the manual using pcap_loop<BR>
&nbsp;<BR>
<A href="http://www.winpcap.org/docs/docs_40_2/html/group__wpcap__tut6.html">http://www.winpcap.org/docs/docs_40_2/html/group__wpcap__tut6.html</A><BR>
&nbsp;<BR>
and&nbsp; I think something it's wrong, because with pcap_next_ex give me incoherent ports and some ip's, what's happen? thanks<BR>
&nbsp;<BR>
// 4 bytes IP address<BR>typedef struct ip_address{<BR>&nbsp;u_char byte1;<BR>&nbsp;u_char byte2;<BR>&nbsp;u_char byte3;<BR>&nbsp;u_char byte4;<BR>}ip_address;<BR>
// 20 bytes IP Header<BR>typedef struct ip_header{<BR>&nbsp;u_char ver_ihl; // Version (4 bits) + Internet header length (4 bits)<BR>&nbsp;u_char tos; // Type of service<BR>&nbsp;u_short tlen; // Total length<BR>&nbsp;u_short identification; // Identification<BR>&nbsp;u_short flags_fo; // Flags (3 bits) + Fragment offset (13 bits)<BR>&nbsp;u_char ttl; // Time to live<BR>&nbsp;u_char proto; // Protocol<BR>&nbsp;u_short crc; // Header checksum<BR>&nbsp;ip_address saddr; // Source address<BR>&nbsp;ip_address daddr; // Destination address<BR>&nbsp;u_int op_pad; // Option + Padding -- NOT NEEDED!<BR>}ip_header;<BR>
typedef struct udp_header{<BR>&nbsp;u_short sport;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Source port<BR>&nbsp;u_short dport;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Destination port<BR>&nbsp;u_short len;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Datagram length<BR>&nbsp;u_short crc;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // Checksum<BR>}udp_header;<BR>
int main()<BR>{<BR>&nbsp;pcap_if_t *alldevs;<BR>&nbsp;pcap_if_t *d;<BR>&nbsp;int inum;<BR>&nbsp;int i=0;<BR>&nbsp;pcap_t *adhandle;<BR>&nbsp;int res;<BR>&nbsp;char errbuf[PCAP_ERRBUF_SIZE];<BR>&nbsp;struct tm *ltime;<BR>&nbsp;char timestr[16];<BR>&nbsp;struct pcap_pkthdr *header;<BR>&nbsp;const u_char *pkt_data;<BR>&nbsp;time_t local_tv_sec;<BR>
<BR>&nbsp;&nbsp;&nbsp; /* Retrieve the device list on the local machine */<BR>&nbsp;&nbsp;&nbsp; if (pcap_findalldevs_ex(PCAP_SRC_IF_STRING, NULL, &amp;alldevs, errbuf) == -1)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr,"Error in pcap_findalldevs: %s\n", errbuf);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; exit(1);<BR>&nbsp;&nbsp;&nbsp; }<BR>
&nbsp;&nbsp;&nbsp; /* Print the list */<BR>&nbsp;&nbsp;&nbsp; for(d=alldevs; d; d=d-&gt;next)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("%d. %s", ++i, d-&gt;name);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if (d-&gt;description)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(" (%s)\n", d-&gt;description);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; else<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf(" (No description available)\n");<BR>&nbsp;&nbsp;&nbsp; }<BR>
&nbsp;&nbsp;&nbsp; if(i==0)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\nNo interfaces found! Make sure WinPcap is installed.\n");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<BR>&nbsp;&nbsp;&nbsp; }<BR>
&nbsp;&nbsp;&nbsp; printf("Enter the interface number (1-%d):",i);<BR>&nbsp;&nbsp;&nbsp; scanf("%d", &amp;inum);<BR>
&nbsp;&nbsp;&nbsp; if(inum &lt; 1 || inum &gt; i)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("\nInterface number out of range.\n");<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Free the device list */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pcap_freealldevs(alldevs);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<BR>&nbsp;&nbsp;&nbsp; }<BR>
&nbsp;&nbsp;&nbsp; /* Jump to the selected adapter */<BR>&nbsp;&nbsp;&nbsp; for(d=alldevs, i=0; i&lt; inum-1 ;d=d-&gt;next, i++);<BR>
&nbsp;&nbsp;&nbsp; /* Open the device */<BR>&nbsp;&nbsp;&nbsp; if ( (adhandle= pcap_open(d-&gt;name,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // name of the device<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 65536,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // portion of the packet to capture.<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // 65536 guarantees that the whole packet will be captured on all the link layers<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; PCAP_OPENFLAG_PROMISCUOUS,&nbsp;&nbsp;&nbsp; // promiscuous mode<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; 1000,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // read timeout<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; NULL,&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // authentication on the remote machine<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; errbuf&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; // error buffer<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; ) ) == NULL)<BR>&nbsp;&nbsp;&nbsp; {<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; fprintf(stderr,"\nUnable to open the adapter. %s is not supported by WinPcap\n", d-&gt;name);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; /* Free the device list */<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; pcap_freealldevs(alldevs);<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<BR>&nbsp;&nbsp;&nbsp; }<BR>
&nbsp;&nbsp;&nbsp; printf("\nlistening on %s...\n", d-&gt;description);<BR>
&nbsp;&nbsp;&nbsp; /* At this point, we don't need any more the device list. Free it */<BR>&nbsp;&nbsp;&nbsp; pcap_freealldevs(alldevs);<BR>
<BR>ip_header *ip; //ip header<BR>udp_header *udp;<BR>u_int ip_len;<BR>u_short sport,dport;<BR>
<BR>&nbsp;&nbsp;&nbsp; while((res=pcap_next_ex( adhandle, &amp;header, &amp;pkt_data))&gt;=0)<BR>&nbsp;&nbsp;&nbsp; {<BR>
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; if(res == 0)<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; //Timeout elapsed<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; continue;<BR>
ip = (ip_header*)(pkt_data + 14);<BR>
ip_len = (ip-&gt;ver_ihl &amp; 0xf) * 4; //Longitud de Ip header<BR>udp = (udp_header *)((u_char *)ip + ip_len);<BR>
sport = ntohs( udp-&gt;sport );<BR>dport = ntohs( udp-&gt;dport );<BR>
printf("Dir Sourc: %d.%d.%d.%d\n", ip-&gt;saddr.byte1,ip-&gt;saddr.byte2,ip-&gt;saddr.byte3,ip-&gt;saddr.byte4);<BR>printf("Dir Dest: %d.%d.%d.%d\n", ip-&gt;daddr.byte1,ip-&gt;daddr.byte2,ip-&gt;daddr.byte3,ip-&gt;daddr.byte4);<BR>
printf("Port Sourc: %d\n", sport);<BR>printf("Port Dest: %d\n", dport);<BR>
&nbsp;<BR>
&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; if(res == -1){<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; printf("Error reading the packets: %s\n", pcap_geterr(adhandle));<BR>&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp; return -1;<BR>&nbsp;&nbsp;&nbsp; }<BR>&nbsp;&nbsp;&nbsp; return 0;<BR>}<BR><br /><hr />Sigue de cerca las últimas tendencias y lo que más rompe <a href='http://video.msn.com/video.aspx?mkt=es-es' target='_new'>MSN Vídeo</a></body>
</html>