为什么不用linux ip分片重组linux源代码下载

IPv4报文分片代码 - huyc - 博客园
IP报文内包装了一个ICMP报文,不过还是没法重组报文。想要练习重组报文似乎得直接抓链路层的包才行。
#include &sys/types.h&#include &sys/socket.h&#include &sys/uio.h&#include &netdb.h&#include &linux/icmp.h&#include &linux/ip.h&#include &unistd.h&#include &stdlib.h&#include &stdio.h&#include &errno.h&#include &string.h&#include &netinet/in.h&#include &arpa/inet.h&struct
//IP报头char buf[128];
//ICMP报头//校验和,网上挖过来的代码unsigned short checksum(unsigned short *buffer, int size) {
unsigned long cksum = 0;
while (size & 1) {
cksum += *buffer++;
size -= sizeof(unsigned short);
cksum += *(unsigned short*)
cksum = (cksum && 16) + (cksum & 0xffff);
cksum += (cksum && 16);
return (unsigned short) (~cksum);}//获取网络地址int getaddr(const char *name, struct sockaddr_in *addr) {
struct addrinfo hint = { 0, AF_INET, SOCK_RAW, IPPROTO_ICMP };
struct addrinfo *
if ((rv = getaddrinfo(name, 0, &hint, &res)) != 0) {
fprintf(stderr, "error at gethostinfo:%s\n", gai_strerror(rv));
return -1;
memcpy(addr, res-&ai_addr, res-&ai_addrlen);
freeaddrinfo(res);
return 0;}//获取原始套接字int ip_socket() {
if ((sock = socket(AF_INET, SOCK_RAW, IPPROTO_ICMP)) == -1) {
fprintf(stderr, "error at socket:%s\n", strerror(errno));
return -1;
setuid(getuid());
//自己操纵IP报头
if ((rv = setsockopt(sock, IPPROTO_IP, IP_HDRINCL, &rv, sizeof rv) == -1)) {
fprintf(stderr, "error at setsockopt:%s\n", strerror(errno));
return -1;
return}void init(const struct sockaddr_in *src, const struct sockaddr_in *dest) {
char c = 0, *p;
struct icmphdr *icmp = (struct icmphdr *)
for (p = (char *) (icmp + 1); p & buf + sizeof ++p) {
//配置ICMP报头
icmp-&type = ICMP_ECHO;
icmp-&code = 0;
icmp-&checksum = 0;
icmp-&un.echo.id = getpid();
icmp-&un.echo.sequence = 0;
icmp-&checksum = checksum((unsigned short *) buf, sizeof buf);
//配置IP报头,所有单元皆为大端序
ip.version = 4;
ip.ihl = 5;
ip.tos = 0;
ip.tot_len = htons((ip.ihl && 2) + sizeof buf);
ip.id = getpid();
ip.frag_off = 0;
ip.ttl = 223;
ip.protocol = IPPROTO_ICMP;
ip.check = 0;
memcpy(&ip.saddr, &src-&sin_addr, sizeof(src-&sin_addr));
memcpy(&ip.daddr, &dest-&sin_addr, sizeof(dest-&sin_addr));}//发送分片,last为1时结束int sendfrag(int sock, const struct sockaddr_in *dest, char *base, uint off,
uint size, int last) {
if (last) {
flag = 0x40;
flag = 0x60;
//MF|DF位,,大端序
int tot_len = sizeof(ip) +
ip.tot_len = htons(tot_len);
ip.frag_off = htons(off && 3);
ip.frag_off |=
ip.check = checksum((unsigned short *) &ip, sizeof ip);
char sendb[tot_len];
//自己设置IP报头时,MSG_MORE似乎无效,所以还是得拷贝数据
memcpy(sendb, &ip, sizeof ip);
memcpy(sendb + sizeof ip, base + off, size);
if ((rv = sendto(sock, sendb, tot_len, 0, (struct sockaddr*) dest,
sizeof(struct sockaddr_in))) == -1) {
fprintf(stderr, "error at sendto1:%s\n", strerror(errno));
return -1;
return}int main(int argc, char *argv[]) {
struct sockaddr_in src,
char buf2[256];
getaddr("127.0.0.1", &src);
getaddr(argv[1], &dest);
printf("from host:%s ---&", inet_ntoa(src.sin_addr));
printf(" to host: %s\n", inet_ntoa(dest.sin_addr));
int sock = ip_socket();
if (sock == -1) {
fprintf(stderr, "sock err and exit.\n");
return -1;
init(&src, &dest);
uint i, len = sizeof
for (i = 0; i & 1024; ++i) {
printf("ping dest: %s...", inet_ntoa(dest.sin_addr));
sendfrag(sock, &dest, buf, 0, 32, 0);
sendfrag(sock, &dest, buf, 32, 32, 0);
sendfrag(sock, &dest, buf, 64, 32, 0);
sendfrag(sock, &dest, buf, 96, 32, 1);
recvfrom(sock, buf2, 256, 0, (struct sockaddr *) &dest, &len);
printf("recved.\n");
printf("done.\n");
return 0;}新手园地& & & 硬件问题Linux系统管理Linux网络问题Linux环境编程Linux桌面系统国产LinuxBSD& & & BSD文档中心AIX& & & 新手入门& & & AIX文档中心& & & 资源下载& & & Power高级应用& & & IBM存储AS400Solaris& & & Solaris文档中心HP-UX& & & HP文档中心SCO UNIX& & & SCO文档中心互操作专区IRIXTru64 UNIXMac OS X门户网站运维集群和高可用服务器应用监控和防护虚拟化技术架构设计行业应用和管理服务器及硬件技术& & & 服务器资源下载云计算& & & 云计算文档中心& & & 云计算业界& & & 云计算资源下载存储备份& & & 存储文档中心& & & 存储业界& & & 存储资源下载& & & Symantec技术交流区安全技术网络技术& & & 网络技术文档中心C/C++& & & GUI编程& & & Functional编程内核源码& & & 内核问题移动开发& & & 移动开发技术资料ShellPerlJava& & & Java文档中心PHP& & & php文档中心Python& & & Python文档中心RubyCPU与编译器嵌入式开发驱动开发Web开发VoIP开发技术MySQL& & & MySQL文档中心SybaseOraclePostgreSQLDB2Informix数据仓库与数据挖掘NoSQL技术IT业界新闻与评论IT职业生涯& & & 猎头招聘IT图书与评论& & & CU技术图书大系& & & Linux书友会二手交易下载共享Linux文档专区IT培训与认证& & & 培训交流& & & 认证培训清茶斋投资理财运动地带快乐数码摄影& & & 摄影器材& & & 摄影比赛专区IT爱车族旅游天下站务交流版主会议室博客SNS站务交流区CU活动专区& & & Power活动专区& & & 拍卖交流区频道交流区
⇊这是1只菜鸡⇊
空间积分0 信誉积分585 UID阅读权限20积分337帖子精华可用积分337 专家积分0 在线时间360 小时注册时间最后登录
稍有积蓄, 积分 337, 距离下一级还需 163 积分
帖子主题精华可用积分337 专家积分0 在线时间360 小时注册时间最后登录
论坛徽章:0
//libnids/src/ip_fragment.c
667& &if (this_host)
668& &&&qp = ip_find(iph);
669& &else
670& &&&qp = 0;
671
672& &/* Is this a non-fragmented datagram? */
675& &offset = ntohs(iph-&ip_off);
676& &flags = offset & ~IP_OFFSET;
677& &offset &= IP_OFFSET;//
678& &//如果找到了该节点且是非IP分片,
679& &//则释放包括ipq在内的整个ipfrag链表
680& &if (((flags & IP_MF) == 0) && (offset == 0)) {
681& &&&if (qp != NULL)
682& && & ip_free(qp);& && &/* Fragmented frame replaced by full unfragmented copy */
684& &&&return 0;
685& &}复制代码删掉了一部分注释,行号就不一一对应了。
我的问题是:& &在 ip_defrag_stub()函数里,收到非分片ip包时,传入的skb参数为空,那么这个时候在 ip_defrag() 里运行至669行时 qp赋值为0,对吧?
& && && && && && & 然后运行至681行时,条件为假跳到684行直接返回0了,它是怎么进入ip_free()函数的?
谢谢各位的帮助了!
&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp&&nbsp|&&nbsp
空间积分0 信誉积分1231 UID阅读权限30积分1686帖子精华可用积分1696 专家积分0 在线时间2178 小时注册时间最后登录
家境小康, 积分 1686, 距离下一级还需 314 积分
帖子主题精华可用积分1696 专家积分0 在线时间2178 小时注册时间最后登录
论坛徽章:0
不进入不行?
⇊这是1只菜鸡⇊
空间积分0 信誉积分585 UID阅读权限20积分337帖子精华可用积分337 专家积分0 在线时间360 小时注册时间最后登录
稍有积蓄, 积分 337, 距离下一级还需 163 积分
帖子主题精华可用积分337 专家积分0 在线时间360 小时注册时间最后登录
论坛徽章:0
群雄逐鹿中原
假如真是按照您所说的,我还是有个疑问。
if (qp != NULL)
ip_free(qp);& && &/* Fragmented frame replaced by full unfragmented copy */
不就白写了?
可以说的更详细吗?
北京皓辰网域网络信息技术有限公司. 版权所有 京ICP证:060528号 北京市公安局海淀分局网监中心备案编号:
广播电视节目制作经营许可证(京) 字第1234号
中国互联网协会会员&&联系我们:
感谢所有关心和支持过ChinaUnix的朋友们
转载本站内容请注明原作者名及出处有熟悉LINUX内核对IP分片处理的朋友么?问题请教
[问题点数:100分,结帖人teleinfor]
有熟悉LINUX内核对IP分片处理的朋友么?问题请教
[问题点数:100分,结帖人teleinfor]
不显示删除回复
显示所有回复
显示星级回复
显示得分回复
只显示楼主
相关帖子推荐:
本帖子已过去太久远了,不再提供回复功能。IPfragment ip分片重组 vc6.0下源代码 含有注释 WinSock-NDIS 网络编程 182万源代码下载-
&文件名称: IPfragment
& & & & &&]
&&所属分类:
&&开发工具: Visual C++
&&文件大小: 359 KB
&&上传时间:
&&下载次数: 16
&&提 供 者:
&详细说明:ip分片重组 vc6.0下源代码 含有注释-ipfragment
文件列表(点击判断是否您需要的文件,如果是垃圾请在下面评价投诉):
&&libnids-1_21 中 IP 分片重组分析 之代码 - sandrain_zeq的专栏 - CSDN博客.mht&&libnids-1_21 中 IP 分片重组分析 之数据结构与处理流程 - sandrain_zeq的专栏 - CSDN博客.mht
&近期下载过的用户:
&相关搜索:
&输入关键字,在本站182万海量源码库中尽情搜索:
&[] - 利用抓包的sdk捕获网卡上的数据包,分析包的头部,一层一层的解析,ip,icmp,tcp,最后手动的重组这些包,复现原来的网页,有助于理解tcp/ip协议
&[] - 几个网络数据截获与分析相关的源码与资料,有助于tcpip协议的理解、ip包的重组还原应用研究
&[] - 课程设计―IP分片重装模块设计实现
&[] - 利用Conncet()TCP三次握手的扫描器小程序
&[] - ip重组的程序,很好用啊!该算法计算很快,能有效重组!
&[] - Ethereal对HTTP、DNS、SMTP、TELNET、RTP协议的分析}

我要回帖

更多关于 linux源代码 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信