<html>
<head>
<style>
.hmmessage P
{
margin:0px;
padding:0px
}
body.hmmessage
{
FONT-SIZE: 10pt;
FONT-FAMILY:Tahoma
}
</style>
</head>
<body class='hmmessage'>
I have see several methods for retrieve packets position<BR>&nbsp;<BR>suppose I have these structures:<BR>&nbsp;<BR>// 20 bytes IP Header<BR>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;in_addr saddr;<BR>&nbsp;in_addr daddr;<BR>&nbsp;// u_int op_pad; // Option + Padding -- NOT NEEDED!<BR>}ip_header;<BR>&nbsp;<BR>//"Simple" struct for TCP<BR>struct tcp_header {<BR>&nbsp;u_short sport; // Source port<BR>&nbsp;u_short dport; // Destination port<BR>&nbsp;u_int seqnum; // Sequence Number<BR>&nbsp;u_int acknum; // Acknowledgement number<BR>&nbsp;u_char th_off; // Header length<BR>&nbsp;u_char flags; // packet flags<BR>&nbsp;u_short win; // Window size<BR>&nbsp;u_short crc; // Header Checksum<BR>&nbsp;u_short urgptr; // Urgent pointer<BR>
}tcp_header;<BR>&nbsp;<BR>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><BR>struct ip_header *ip; //ip header<BR>struct tcp_header *tcp; //tcp header<BR>struct udp_header *udp;<BR>&nbsp;<BR>to calculate ip packet position:<BR>&nbsp;<BR>ip=(struct ip_header *)(pkt_data +14);&nbsp;<BR>&nbsp;<BR>to calculate udp packet position:<BR>&nbsp;<BR>1//<BR>&nbsp;<BR>udp = (struct udp_header *)(sizeof(struct ip_header)+pkt_data+14)<BR>&nbsp;<BR>2//<BR>&nbsp;<BR>u_int ip_len = (ip-&gt;ver_ihl &amp; 0xf) * 4; <BR>udp = (struct udp_header *)((u_char *)ip + ip_len); <BR>&nbsp;<BR>in this case, ip_len retrieve the packet length of ihl, but I don't understand&nbsp;<BR>&nbsp;<BR>((u_char *)ip + ip_len);&nbsp; <BR>&nbsp;<BR>3//<BR>&nbsp;<BR>udp&nbsp;= (struct udp_header*)(pkt_data +&nbsp;14 + ip_len); <BR>&nbsp;<BR>Can tell me which one is the correct form, I think is the second but I don't understand it very well... and the second form is the same form for retrieve tcp packets?<BR>
&nbsp;<BR>
tcp&nbsp;= (struct tcp_header *)((u_char *)ip + ip_len);&nbsp; <BR>
&nbsp;<BR>
thanks<BR><BR><br /><hr />Todo ruedas: información práctica y todo el glamour del mundo del motor. <a href='http://estilo.es.msn.com/' target='_new'>MSN Estilo y Tendencias</a></body>
</html>