免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
123
最近访问板块 发新帖
楼主: ecjtubaowp

linux下在应用层如何修改数据包 [复制链接]

论坛徽章:
0
发表于 2008-07-16 12:30 |显示全部楼层
感谢楼上分享代码。问题:如果一个包是应该被这台机器转发的,通过raw socket可以收到一份,之后内核里面的那份就被丢弃了?还是继续被转发?看代码里面对本地发出的包的处理,应该内核会继续处理的。这样怎样解决重复包的问题呢?

if(in_addr.sll_pkttype==PACKET_OUTGOING){printf("won't send me again;\n");continue;}                    
       dest.sll_family=AF_PACKET;
       dest.sll_ifindex =ifr.ifr_ifindex;
       dest.sll_halen=htons(ETH_HLEN);     
       memmove(&dest.sll_addr,buffer,sizeof(buffer[0])*8);
       n=sendto(sendfd,buffer,recv_len,0,(struct sockaddr*)&dest,sizeof(dest));

这段的意思好像是判断如果是发出去的包就不管,否则就修改并发出。按理说如果内核的部分会自动被丢弃的话,无论怎样都要重发一遍的,有点说不通。

论坛徽章:
1
CU十二周年纪念徽章
日期:2013-10-24 15:41:34
发表于 2008-07-16 16:22 |显示全部楼层
原帖由 piaobo79 于 2008-7-16 12:30 发表
感谢楼上分享代码。问题:如果一个包是应该被这台机器转发的,通过raw socket可以收到一份,之后内核里面的那份就被丢弃了?还是继续被转发?看代码里面对本地发出的包的处理,应该内核会继续处理的。这样怎样解 ...

我也有同样的疑问???

论坛徽章:
0
发表于 2008-07-16 16:58 |显示全部楼层
最开始写代码的目的只是监听网络上的其他主机,所以没考虑到本身主机的转发情况,如果是转发,的确会被重复发送 但是我看楼主的要求是修改截取到的包,并未说转发的情况。。事实上,这段代码我当初也只是用于路由目的。

[ 本帖最后由 hijohnny 于 2008-7-16 17:15 编辑 ]

论坛徽章:
0
发表于 2008-07-23 17:01 |显示全部楼层
libpcap抓到IP包了,那应该修改起来很简单了。libpcap数据包中,特别是在回调函数参数里面,会传入一个const u_char *packet_content的指针,这个实际上就是指向了数据包了,你去掉他的数据包包首部分(这个长度取决于你获取数据包的层),剩下的就是数据部分。

论坛徽章:
0
发表于 2008-07-23 17:14 |显示全部楼层
问题貌似没有解决啊……如果转发的情况怎么处理呢?

像2楼贴出的代码,如果是转发包的话,就等于发出了两份数据,接收端会怎么处理呢?

用netfilter怎么做出来呢?我很好奇的说……也想看看神奇的netfilter,但是不知道如何入手……

论坛徽章:
1
天蝎座
日期:2015-03-09 10:14:22
发表于 2015-04-07 18:30 |显示全部楼层
这个问题还是没有搞定吗 我也遇到了相同的问题 求助有相关经验的回复
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP