免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 2933 | 回复: 4
打印 上一主题 下一主题

如何得到所抓数据包的总大小? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2010-01-06 16:35 |只看该作者 |倒序浏览
例如。我建立raw socket 把数据包抓到了buf里

但是我没法确定这个数据包里到底有多大的数据

ethhdr iphdr tcphdr里都没有相关的信息

我又无法进行sizeof 和strlen


到底该如何做呢?

论坛徽章:
0
2 [报告]
发表于 2010-01-06 16:42 |只看该作者
ip头里有ip_len的域啊,再加上MAC头部(以太网为14byte,其它的可以查RFC标准或内核协议栈的定义)就是全长了

论坛徽章:
0
3 [报告]
发表于 2010-01-06 18:10 |只看该作者
struct iphdr {
#if __BYTE_ORDER == __LITTLE_ENDIAN
        uint8_t ihl:4,
                version:4;
#elif __BYTE_ORDER == __BIG_ENDIAN
        uint8_t version:4,
                ihl:4;
#else
#error No VAXen please. Give me a sensible endianness.
#endif
        uint8_t tos;
        uint16_t        tot_len;
        uint16_t        id;
        uint16_t        frag_off;
        uint8_t ttl;
        uint8_t protocol;
        uint16_t        check;
        uint32_t        saddr;
        uint32_t        daddr;
        /*The options start here. */
};

你说的是tot_len吧??
那是整个IP报的长度啊。有16位65535bit
MTU才1500

所以肯定不是我想得到的,当前抓到包的长度

论坛徽章:
0
4 [报告]
发表于 2010-01-11 13:24 |只看该作者

回复 #1 seskissinger 的帖子

如果有IP头的话,从IP头开始到包结尾的长度就是4*ip_len了(IP_len是IP结构体中的一项),这里不包括以太网头。以太网头可以根据TYPE计算,一般不是14就是18。
另外你既然是捕获数据包,那么recv()或者recvfrom()时,返回值应该就是得到的数据的大小吧?

论坛徽章:
0
5 [报告]
发表于 2010-01-11 13:31 |只看该作者

回复 #3 seskissinger 的帖子

4*iphdr->tot_len + 以太网头就是长度。
MTU是分片长度
数据包长度是可以大于1500的,只是为了在经过所有路由时能被正确解析,所以规定一个最大分片长度的,如果在局域网内,就有可能分片大于这个长度,为了提高传送速度,两台机器之间会用两者可用的最大分片长度的。

引用
----------------------------------
“你说的是tot_len吧??
那是整个IP报的长度啊。有16位65535bit
MTU才1500

所以肯定不是我想得到的,当前抓到包的长度

------------------------------------
我想这个你可以再去抓包计算一下试试看对不对,我觉得不太可能不是你当前抓到的包的长度
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP