11.4.6 定位UDP报头的编程方法
UDP的数据结构如图11.14所示。
图11.14 UDP数据结构示意图
UDP的头部数据结构在文件<Linux/udp.h>中定义,代码如下:
struct udphdr
{
u_int16_t source; /*源地址端口*/
u_int16_t dest; /*目的地址端口*/
u_int16_t len; /*UDP长度*/
u_int16_t check; /*UDP校验和*/
};
头部数据结构的布局如图11.15所示。
图11.15 Linux环境下UDP头部示意图
对于UDP协议,其IP头部的protocol的值为17,通过计算IP头部的长度可以得到UDP头部的地址,即UDP的头部为IP头部偏移ihl*4。UDP的源端口和目的端口可以通过成员source和dest来获得。下面的代码将源端口和目的端口的值打印出来:
/*打印UDP报文的源端口值和目的端口值*/
if(p_iphdr->protocol==17)
{
/*取得UDP报头*/
struct udphdr*p_udphdr = (struct udphdr*)(p_iphdr+p_iphdr->ihl*4);
/*打印源端口值*/
printf("src port:%d/n", ntohs(p_udphdr->source));
/*打印目的端口值*/
printf("dest port:%d/n", ntohs(p_udphdr->dest));