社区
网络编程
帖子详情
关于直接读取网卡接收到的数据包的问题
wzz_boy
2008-03-19 11:45:42
我想实现的功能是:启动一个应用程序之后全权接管一个硬件网卡的收发数据。应用程序能够到网卡内存里(或网卡与系统接口之间,总之不能是系统内存里缓存的数据包)接收所有该网卡收到的网络传输层数据,同时也能够自己组数据包直接交给网卡发送.
请问该怎样实现这样的功能,要用到驱动编程吗?用winpcap能不能实现,怎样实现呢,请各位帮帮忙,很急!!
...全文
1105
13
打赏
收藏
关于直接读取网卡接收到的数据包的问题
我想实现的功能是:启动一个应用程序之后全权接管一个硬件网卡的收发数据。应用程序能够到网卡内存里(或网卡与系统接口之间,总之不能是系统内存里缓存的数据包)接收所有该网卡收到的网络传输层数据,同时也能够自己组数据包直接交给网卡发送. 请问该怎样实现这样的功能,要用到驱动编程吗?用winpcap能不能实现,怎样实现呢,请各位帮帮忙,很急!!
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
13 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
dolby_jiang
2011-05-25
打赏
举报
回复
我也正在找学习这方面的东西,我遇到的问题是:我用Socket的recvfrom接收到的数据与用Wireshark软件接收的数据不同,不知道这两者之间有什么区别?
db300
2008-11-16
打赏
举报
回复
我也在寻求解决这个问题的办法,如果透过Windows操作系统直接读取网卡接收的数据,我想应该必须依赖底层驱动吧?关键是这个驱动应该怎样写?
cuiyang0729
2008-03-19
打赏
举报
回复
楼上说得不对。你如果想直接给网卡发数据,就是需要驱动编程的。用原始套接字(就是楼上说的SOCK_RAW方式),也是要经过操作系统(比如说windows)的tcp/ip协议栈的,依赖于具体的操作系统。
而wincap其实也是一个软件层,wincap能不能用,具体要看楼主需要实现哪些功能?
fengershiji
2008-03-19
打赏
举报
回复
不用写驱动,直接用socket编程就行,首先的把网卡设为混杂模式,然后创建接收链路层所有数据包的套接口,socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL)),然后直接recvfome and sendto 就行了。
美伊小公主的奶爸
2008-03-19
打赏
举报
回复
[Quote=引用 9 楼 greatws 的回复:]
引用 5 楼 cymvp 的回复:
wincap也是微软提供的上层软件层的东西,你要是想直接读网卡的数据,只能从驱动入手。而且windows的网络驱动还分3层,从上往下是协议驱动,中间层驱动,微端口驱动。收到的数据是一层一层上来的,之后协议驱动会把数据交给上层协议栈,比如tcp/ip协议栈。
你错了,winpcap是驱动,不是上层软件层的东西,可以跨平台使用的,不仅仅适用于windows平台
LZ用pcap怎么会有2分钟的延时?我倒是没…
[/Quote]
恩,我刚才查了查,wincap确实是属于协议驱动的东西,我一般是自己写简单的协议驱动的,没有用过wincap,只是听说wincap是微软开发的独立于tcp/ip协议栈的类库,所以以为也是软件层的东西呢,谢谢纠正!
wzz_boy
2008-03-19
打赏
举报
回复
才10毫秒左右,不会吧?我做出来的确实会延时一分多钟,你的是怎么实现的?
greatws
2008-03-19
打赏
举报
回复
[Quote=引用 5 楼 cymvp 的回复:]
wincap也是微软提供的上层软件层的东西,你要是想直接读网卡的数据,只能从驱动入手。而且windows的网络驱动还分3层,从上往下是协议驱动,中间层驱动,微端口驱动。收到的数据是一层一层上来的,之后协议驱动会把数据交给上层协议栈,比如tcp/ip协议栈。
[/Quote]
你错了,winpcap是驱动,不是上层软件层的东西,可以跨平台使用的,不仅仅适用于windows平台
LZ用pcap怎么会有2分钟的延时?我倒是没有多少延时,也就10毫秒左右吧
vcPlayer
2008-03-19
打赏
举报
回复
全权接管一个硬件网卡的收发数据??
恐怕得要做驱动吧。
wzz_boy
2008-03-19
打赏
举报
回复
我就是用winpcap写了个接收数据的程序,比如说,现在我的系统时间是15:06:10,而我的程序接收到的数据所显示的时间却是15:04:20,就是说,接收到的数据是系统缓存里的过时了的数据了,而不是此刻所接收到的数据.
int receiveIPv4(u_char desIP[4])///////////存在的问题:当接收不到对应的arp应答包时,不会自动停止并跳出循环
{
int res=0;
int i=0,j=0;
int count=0;
struct tm *ltime=NULL;
char timestr[16]={0};
time_t local_tv_sec=NULL;
startSendEmptyCommand(desIP,num);
while((res = pcap_next_ex( fp, &header, &pkt_data)) >= 0)
{
if(kbhit())//按下任意键结束接收数据
{
printf("已停止接收信息\n");
fprintf(log,"已停止接收信息\n");
fprintf(message,"已停止接收信息\n");
break;
}
if(res == 0)/* Timeout elapsed */
{
startSendEmptyCommand(desIP,num);
continue;
}
pIpHead ip=(pIpHead)pkt_data;
//如果协议不同,且ip包来源的IP地址与该从机的IP地址不同,且ip包发送目的不是主机 就不能通过
if( ntohs(ip->eh_type)==0x0800 )
{
/* 将时间戳转换成可识别的格式 */
local_tv_sec = header->ts.tv_sec;
ltime=localtime(&local_tv_sec);
strftime( timestr, sizeof timestr, "%H:%M:%S", ltime);
printf("%s,%.6d len:%d\n", timestr, header->ts.tv_usec, header->len);
printf("从机IP:");
printIP(ip->ip_src);//打印源IP地址
printf(" ----> ");
printf("主机IP:");
printIP(ip->ip_dst);//打印目的IP地址
for (i=1; i<(header->caplen+1)-2; i+=2)//43开始为正直有用的数据
{
printf( "%d ",pkt_data[i-1]);
if ( ( (i % 16 )== 0 )
printf("\n");
}
printf("\n\n");
Sleep(100);////////
startSendEmptyCommand(desIP,num);
}
else
{
startSendEmptyCommand(desIP,num);
continue;
}
}//end while
if(res == -1)
return -1;
return 0;
}
这个就是我写的接收数据包的函数,那个pkt_data指针里指向的数据包会出错.
也就是说,如果我不直接向网卡发送数据包和读取数据包,那么,我就不能够确定我要发送的数据包是否马上发送了出去,也不能确定我此刻收到的数据包的时间戳是当前系统的时间.
mfc168
2008-03-19
打赏
举报
回复
楼主理解的有点问题,系统可以接收到实时的数据,raw socket就可以接收到原始的数据包,分析数据包模拟数据包发送这个就像以前我弄过的游戏脱机外挂一样
不用复杂到做驱动,如果你做驱动的话,实现你所说的功能还需要自己做协议栈,很麻烦
美伊小公主的奶爸
2008-03-19
打赏
举报
回复
wincap也是微软提供的上层软件层的东西,你要是想直接读网卡的数据,只能从驱动入手。而且windows的网络驱动还分3层,从上往下是协议驱动,中间层驱动,微端口驱动。收到的数据是一层一层上来的,之后协议驱动会把数据交给上层协议栈,比如tcp/ip协议栈。
greatws
2008-03-19
打赏
举报
回复
不知道你说的实时是个什么概念,要知道不管怎么样都是有多少延时的,用pcap的话,可以把超时的时间设置短一点,达到尽可能接近“实时”
winpcap只是起到发包、分析、嗅探的作用,至于你说的接管,恐怕做不到,你可以看下winpcap的开发文档
wzz_boy
2008-03-19
打赏
举报
回复
就是要实现启动应用程序后,直接从网卡的内存中读取数据包,发送数据时,直接发送到网卡内存里,而不用依赖具体的操作系统.
目前我用winpcap所实现的程序,只能从windows系统的缓存里读取网卡接收来的数据,所以,所接收来的数据都是在当前系统时间之前的数据来的而不是实时的数据.
Flink
读取
Kafka数据保存到Redis的解决方案教程
大数据发展史:Flink和storm sparkstreaming对比实时框架如何选择1:需要关注流数据是否需要进行状态管理 2:At-least-once或者Exectly-once消息投递模式是否有特殊要求 3:对于小型独立的项目,并且需要低延迟的场景,建议使用storm 4:如果你的项目已经使用了spark,并且秒级别的实时处理可以满足需求的话,建议使用sparkStreaming5:要求消息投递语义为 Exactly Once 的场景;数据量较大,要求高吞吐低延迟的场景;需要进行状态管理或窗口统计的场景,建议使用flink针对以上知识我们通过flink
读取
kafka保存到redis方式快速让大家学习flink如何使用,以及我们如果搭建高性能的flink应用,这个课程属于快速实战篇。Flink + kafka + redis 实时计算
linux系统是如何获取
网卡
的通信数据的
当网络
数据包
到达
网卡
时,硬件设备会对
数据包
进行处理,然后将其存储在内部缓冲区中。:
网卡
对应的驱动程序将
数据包
从硬件缓冲区中取出,并将其传递给内核的网络子系统。驱动程序功能包括处理硬件中断和错误,通过 ...
网卡
驱动的
数据包
发送
接收
但是,这一种方法,有一种重要的
问题
,就是大流量的数据来到,
网卡
会产生大量的中断,内核在中断上下文中,会浪费大量的资源来处理中断本身。所以,一个
问题
是,“可不可以不使用中断”,这就是轮询技术,所谓NAPI...
Linux
网卡
数据包
的
接收
这并非是一个
网卡
驱动分析的专门文档,只是对
网卡
处理
数据包
的流程进行一个重点的分析。这里以Intel的e100驱动为例进行分析。 大多数
网卡
都是一个PCI设备,PCI设备都包含了一个标准的配置寄存器,寄存器中,包含了...
网络数据被
网卡
接收
后在电脑内部的流转过程
网络数据被
网卡
接收
后在电脑内部的流转过程
网络编程
18,356
社区成员
64,214
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章