社区
网络编程
帖子详情
关于直接读取网卡接收到的数据包的问题
wzz_boy
2008-03-19 11:45:42
我想实现的功能是:启动一个应用程序之后全权接管一个硬件网卡的收发数据。应用程序能够到网卡内存里(或网卡与系统接口之间,总之不能是系统内存里缓存的数据包)接收所有该网卡收到的网络传输层数据,同时也能够自己组数据包直接交给网卡发送.
请问该怎样实现这样的功能,要用到驱动编程吗?用winpcap能不能实现,怎样实现呢,请各位帮帮忙,很急!!
...全文
1174
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系统的缓存里读取网卡接收来的数据,所以,所接收来的数据都是在当前系统时间之前的数据来的而不是实时的数据.
数据包
从
网卡
到应用进程
从空间来看,从
网卡
到内核空间,再到用户空间,整个过程就是内核将
网卡
中的
数据包
拷贝到应用程序。 1.
网卡
网卡
收到的是
数据包
的电信号,收到该电信号之后,会将该电信号转化为数字信息,然后进行FCS校验,最后检查
数据包
的MAC地址是否匹配。
网卡
将电信号转化为数字信息之后包含的
数据包
的信息如下所示: 还原后的数据信息会在
网卡
上,根据 FCS(帧校验序列,Frame Check Sequence)校验数据,判断数据在传输过程是否因噪音等影响导致信号失真,从而导致数据错误,需要丢弃这种无效的
数据包
。...
Linux网络-
数据包
接收
过程
本文将介绍在Linux系统中,
数据包
是如何一步一步从
网卡
传到进程手中的。 如果英文没有
问题
,强烈建议阅读后面参考里的两篇文章,里面介绍的更详细。 本文只讨论以太网的物理
网卡
,不涉及虚拟设备,并且以一个UDP包的
接收
过程作为示例. 本示例里列出的函数调用关系来自于kernel 3.13.0,如果你的内核不是这个版本,函数名称和相关路径可能不一样,但背后的原理应该是一样的(或者有细微差别)
网卡
到内存
网卡
需要有驱动才能工作,驱动是加载到内核中的模块,负责衔接
网卡
和内核的网络模块,驱动在加载的时候将自
TCP
数据包
的
接收
过程
TCP
数据包
的
接收
过程 1,一般
网卡
接收
数据是以触发中断来
接收
的,在
网卡
driver中,
接收
到数据时,往kernel的api:netif_rx()丢 2,接着数据被送到IP层ip_local_deliver_finish(),经过剥离ip头部,把数据往TCP层发 3,tcp层tcp_v4_rcv()收到数据后,再调用tcp_rcv_established()处理,如果当前用户进程没有正在
读取
数据,...
linux 查看
网卡
接收
流量大小_Linux网络
数据包
的揭秘以及常见的调优方式总结
可
直接
点击上方蓝字(网易游戏运维平台) 关注我们,获一手游戏运维方案lott 网易游戏业务 SRE, 专注于业务运维的质量和效率 , 喜欢研究 Linux 系统原理。目前负责《一梦江湖》、《猎魂觉醒》、《非人学园》等产品的运维工作。 总结是进步的阶梯、分享是快乐的源泉 , 技术人就是要不断总结、不断分享。作为业务 SRE,我们所运维的业务,常常以 Linux+TCP/UDP daemo...
网卡
驱动:stmmac DMA
接收
流程
1. dmabuffer及zero-copy 在打开
网卡
时,stmmac_init_rx_buffers()函数负责分配dmabuffer。 static int stmmac_init_rx_buffers(struct stmmac_priv *priv, struct dma_desc *p, int i, gfp_t flags, u32 qu...
网络编程
18,356
社区成员
64,161
社区内容
发帖
与我相关
我的任务
网络编程
VC/MFC 网络编程
复制链接
扫一扫
分享
社区描述
VC/MFC 网络编程
c++
c语言
开发语言
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章