当前位置:  技术问答>linux和unix

网络数据收发监测

    来源: 互联网  发布时间:2015-12-26

    本文导语:  分析linux网络部分代码,了解网络数据包发送接收过程。通过修改内核相关部分代码,或添加相关函数代码实现数据包发送过程的监测。 大家有什么好的意见想法,谢谢! | 一个抓包程序,希望...

分析linux网络部分代码,了解网络数据包发送接收过程。通过修改内核相关部分代码,或添加相关函数代码实现数据包发送过程的监测。

大家有什么好的意见想法,谢谢!

|
一个抓包程序,希望对你有用
#include 
#include 
#include   
#include   
#include    
#include   
#include   
#include   
#include   
#include  
#include   
#include   
#include   
#include   
#include   
#include   
#include   
#include  
#include 

void die(char * why, int n)
{
perror(why);
exit(n);
}

int do_promisc(char * nif, int sock)
{
struct ifreq ifr;

strncpy(ifr.ifr_name, nif, strlen(nif)+ 1);
if ((ioctl(sock, SIOCGIFFLAGS,&ifr)== - 1)) //获得flag
{
die("ioctl", 2);
}

ifr.ifr_flags |= IFF_PROMISC; //重置flag标志

if (ioctl(sock, SIOCSIFFLAGS,&ifr)== - 1) //改变模式
{
die("ioctl", 3);
}
}
//修改网卡成PROMISC(混杂)模式

char buf[40960];

main()
{
struct sockaddr_in addr;
struct ether_header * peth;
struct iphdr * pip;
struct tcphdr * ptcp;
struct udphdr * pudp;

char mac[16];
int i, sock, r, len;
char * data;
char * ptemp;
char ss[32], dd[32];

printf("11111n");
if ((sock = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)))== - 1) //建立socket
//man socket可以看到上面几个宏的意思
{
die("socket", 1);
}
printf("ifconfign");

do_promisc("sn0", sock); //eth0为网卡名称

system("ifconfig");

for (;;)
{
len = sizeof(addr);

r = recvfrom(sock,(char *)buf, sizeof(buf), 0,(struct sockaddr *)&addr,&len);
//调试的时候可以增加一个输出r的语句判断是否抓到包
buf[r]= 0;
ptemp = buf;
peth =(struct ether_header *)ptemp;

ptemp += sizeof(struct ether_header); //指针后移eth头的长度
pip =(struct ip *)ptemp;//pip指向ip层的包头

ptemp += sizeof(struct ip); //指针后移ip头的长度  

switch (pip->protocol) //根据不同协议判断指针类型
{
case IPPROTO_TCP:
ptcp =(struct tcphdr *)ptemp; //ptcp指向tcp头部
printf("TCP pkt :FORM:[%s]:[%d]n", inet_ntoa(*(struct in_addr *)&(pip->saddr)), 
ntohs(ptcp->source));
printf("TCP pkt :TO:[%s]:[%d]n", inet_ntoa(*(struct in_addr *)&(pip->daddr)), 
ntohs(ptcp->dest));

break;

case IPPROTO_UDP:
pudp =(struct udphdr *)ptemp; //ptcp指向udp头部  
printf("UDP pkt:n len:%d payload len:%d from %s:%d to %s:%dn",
r,
ntohs(pudp->len),
inet_ntoa(*(struct in_addr *)&(pip->saddr)),
ntohs(pudp->source),
inet_ntoa(*(struct in_addr *)&(pip->daddr)),
ntohs(pudp->dest)
);
break;

case IPPROTO_ICMP:
printf("ICMP pkt:%sn", inet_ntoa(*(struct in_addr *)&(pip->saddr)));
break;

case IPPROTO_IGMP:
printf("IGMP pkt:n");
break;

default:
printf("Unkown pkt, protocl:%dn", pip->protocol);
break;
} //end switch

perror("dump");
}

}

|
http://www-128.ibm.com/developerworks/cn/linux/l-ntflt/index.html

先看看这篇文章,再理下思路,看看自己需要什么

|
在linux下内核中可以使用netfilter,应用层可以使用libpcap库函数
在windows下可以使用winpcap库函数

|
用Netfilter实现最简单也最通用

|
libpcap

|
libpcap包比较合适你的需求。

|
mark

|
mark

|
Maybe pcap is your best choice

    
 
 
 
本站(WWW.)旨在分享和传播互联网科技相关的资讯和技术,将尽最大努力为读者提供更好的信息聚合和浏览方式。
本站(WWW.)站内文章除注明原创外,均为转载、整理或搜集自网络。欢迎任何形式的转载,转载请注明出处。












  • 相关文章推荐
  • 网络数据在网卡缓冲区,怎么就是收不到了呀,网络线路是好的
  • 如何将网络数据转存到数据库中
  • 网络数据采集分析工具 TCPDUMP
  • 请问网络连接断开,如何让数据在联网后连续发送?
  • 控制在网络上传输TCP数据包的大小的问题
  • 在网络数据传输中,为了降低数据传输量,用哪种算法最好,有哪位大虾帮忙吗?最好有JAVA源代码
  • 网络数据包捕获函数包 libpcap
  • 易得网络数据采集系统
  • 面向网络的数据库 Neo4j
  • 网络数据包发生器 Hyenae
  • 网络数据包捕获函数库 jNetPcap
  • 数据中心网络框架 Fastpass
  • 网络URL数据库 ARADO
  • 网络掉数据包的问题
  • 网络数据大小端问题
  • *************Linux下如何截取网络数据包??*******************
  • 怎么检查网络过来的数据?
  • 如何实现对网络协议栈(TCP/IP)各层数据的提取?!
  • linux使用tcpdump命令监视指定网络数据包的方法
  • linux转发数据,局域网A(eth1)的数据是如何发送到另一个网卡eth0所在的网络上的,只需要设置FORWARD的ACCEPT吗?
  • Docker、Kubernetes、Neutron中的网络简介
  • 怎么用dos命令配置登陆网络,随便什么网络,举例就行~
  • 基于python实现的网络爬虫功能:自动抓取网页介绍
  • 系统网络问题之网络配置
  • 分布式CAP理论介绍:一致性(Consistency),可用性(Availability),容忍网络分区(Partition tolerance)
  • 网络爬虫/网络蜘蛛 larbin
  • 应对 Docker 网络功能难题的挑战与思考
  • 如何将运行dos的机子联入网络,或在dos下使用网络硬盘
  • Android及andriod无线网络Wifi开发的几点注意事项
  • linux不用命令方式读文件获取网络流量,如何使用C函数调用获取网络流量信息?
  • centos6网络配置及网卡设置相关命令及配置文件


  • 站内导航:


    特别声明:169IT网站部分信息来自互联网,如果侵犯您的权利,请及时告知,本站将立即删除!

    ©2012-2021,,E-mail:www_#163.com(请将#改为@)

    浙ICP备11055608号-3