诡异的UDP报文长度

LinuxJoey 2013-08-13 06:41:56
UDP的头部数据结构在文件<Linux/udp.h>中定义,代码如下:
struct udphdr
{
u_int16_t source; /*源地址端口*/
u_int16_t dest; /*目的地址端口*/
u_int16_t len; /*UDP长度*/
u_int16_t check; /*UDP校验和*/
};

小弟写了抓包程序,专门过滤UDP数据,但是很郁闷的是,为什么UDP报文结构中的len也就是程序中的p_udphdr->len会超过读取到一帧的数据总长,查了很久也是无果,难道是平台问题?要说是指针计算错了也不大可能,因为ip地址端口什么的都是正确的,除了这UDP报文长度不对,请懂的朋友指点一下,谢谢~!
int main(int argc, char ** argv) 
{
struct ifreq ethreq; /* 网络接口结构 */

char ef[ETH_FRAME_LEN]; /*以太帧缓冲区*/
struct ethhdr *p_ethhdr; /*以太网头部指针*/
int n,i;

struct iphdr *p_iphdr;
struct udphdr *p_udphdr;
unsigned char *pucTemp1,*pucTemp2;
char *app_data = NULL; /*应用数据指针*/
int app_len = 0; /*应用数据长度*/
char *UDP_data[2048];
struct sigaction sighandle;

/* 信号设置 */
sighandle.sa_flags = 0;
sighandle.sa_handler = sig_handler;
sigemptyset(&sighandle.sa_mask);
sigaction(SIGTERM, &sighandle, NULL);
sigaction(SIGINT, &sighandle, NULL);
sigaction(SIGQUIT, &sighandle, NULL);

/* 打开套接字 */
if((fd = socket(AF_PACKET, SOCK_RAW, htons(0x0003))) == -1)
{
perror("socket");
exit(1);
}
/* 设置网卡为混杂模式,抓取所有数据 */
strncpy(ethreq.ifr_name, "eth0", IFNAMSIZ);
if(ioctl(fd, SIOCGIFFLAGS, ðreq) == -1)
{
perror("ioctl");
close(fd);
exit(1);
}

ethreq.ifr_flags |= IFF_PROMISC;
if(ioctl(fd, SIOCSIFFLAGS, ðreq) == -1)
{
perror("ioctl");
close(fd);
exit(1);
}
while(1)
{

/*初始化变量*/
memset(ef,0x0,sizeof(ef));
p_ethhdr = NULL;
p_iphdr = NULL;
p_udphdr = NULL;
app_data = NULL;
app_len = 0;

/*从套接口读取链路层的方法*/
p_ethhdr = (struct ethhdr*)ef; /*使p_ethhdr指向以太网帧的帧头*/
/*读取以太网数据,n为返回的实际捕获的以太帧的帧长*/
n = read(fd, ef, ETH_FRAME_LEN);
printf("length:[%u][%s]\n",n,ef);

/*打印IP报文的源IP地址和目的IP地址,由于ip包包含TCP数据包和UDP数据包*/
if(ntohs(p_ethhdr->h_proto)==0x0800) /*0x0800:IP包*/
{
/*定位IP头部*/
p_iphdr = (struct iphdr*) (ef + ETH_HLEN);

/*打印UDP报文的源端口值和目的端口值*/
if(p_iphdr->protocol==17)
{
/*取得UDP报头*/
p_udphdr = (struct udphdr*)(p_iphdr+p_iphdr->ihl*4);

/*获得UDP协议部分的应用数据地址*/
app_data = (char*)(p_udphdr + p_udphdr->len);

/*获得UDP协议部分的应用数据长度*/
app_len = n - 16 - p_iphdr->ihl*4 - p_udphdr->len;
}
}
}

close(fd);
exit(0);
}
...全文
368 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
GOODJOBLIKE 2013-08-26
  • 打赏
  • 举报
回复
网络字节序转主机字节序,你看看是不是,简单的方法就是比如0x1122,就看成0x2211才对,也可以调用相关函数转。
LinuxJoey 2013-08-14
  • 打赏
  • 举报
回复
引用 1 楼 falloutmx 的回复:
和抓包工具进行比较吧,抓到的数据应该没问题,就看你获取长度跳到的位置对不对了
谢谢了,看来也只有这个办法 了
falloutmx 2013-08-14
  • 打赏
  • 举报
回复
和抓包工具进行比较吧,抓到的数据应该没问题,就看你获取长度跳到的位置对不对了

3,846

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 无线
社区管理员
  • 无线
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧