请教怎样直接取以太网帧数据

发布于 2022-07-21 22:04:58 字数 215 浏览 14 评论 9

各位好!
我是个linux新手,毕业设计需要在linux操作系统下用PC机与一个开发板通讯,为了实时性,从数据链路层直接映射到应用层(ASN.1),也就是能直接越过IP和TCP。
我看了一阵子网络编程,又看了些网卡驱动及其相关的代码,感觉很难懂。所以对怎样直接取以太网帧数据没有明确的方法!
敬请各位前辈指点!         谢谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(9

空名 2022-07-22 13:37:32

你可以看看linux设备驱动里边网络部分,会对网卡驱动有一些了解
你说的我觉得可以:1、通过修改网卡驱动,可以把本来收到套接字缓冲区skb中的数据直接拷贝到用户空间
2、或者修改网卡驱动,收到网卡ram中的数据直接拷贝到用户空间,而不创建套接字缓冲区。
可能有点错误,就是给你的建议,呵呵

回忆那么伤 2022-07-22 13:36:56

感谢6,7楼的两位提供这么好的思路!

顾冷 2022-07-22 13:34:47

有两种方案可以实现你的需求,其一是使用raw_socket,这在网上可以找到很多资料;其二是你可以自己编写一个内核模块,在该模块中,你可以直接调用网卡驱动的函数进行报文发送,然后你可以注册网络报文的filter函数,来接收从网卡上来的报文,我想这样比较有难度,但是你一旦做好了,也就对Linux底层的网络报文处理很了解了。

倾其所爱 2022-07-22 13:32:05

直接用PF_PACKET的 raw socket, 或者 netfilter的stolen功能,就可以把链路层帧(包括以太网帧)直接收到用户空间处理,然后在用户空间自己分析。我曾经做过这样的小东西,内核的网络栈可以替换掉。发送的时候也是直接放到底层驱动。不用经过内核的协议栈。

内核不需要作任何变动。

[ 本帖最后由 xiaozhaoz 于 2006-3-30 08:39 编辑 ]

夏九 2022-07-22 13:29:56

谢谢两位高手提供思路!

季末如歌 2022-07-22 13:21:27

这需要你自己动手改写网卡驱动程序。
patrick007说得对
下面这篇论文也许对你有帮助。

http://www.nsfocus.net/index.php ... _id=880&keyword

[ 本帖最后由 jeffshia 于 2006-3-29 19:53 编辑 ]

禾厶谷欠 2022-07-22 13:15:43

直接读网卡寄存器,轮询,中断随便,中断好些,网卡没有不支持中断的吧
在没有使用mmu保护的地方,直接干就可以了,
有mmu的情况,我不太清楚,你查下资料
或者参考一下网卡驱动

。冷情 2022-07-22 12:50:45

不好意思,我把问题说清楚些。我的问题是这样的:

在linux系统下,
1. 通过自编的程序能否实现对以太网帧进行直接收发,中间不经过传输层和网络层.
2. 如果可以,需要怎样做?

请各位高手指点!

柳絮泡泡 2022-07-22 12:11:41

问题描述的不是很清楚
另,请到google上搜 “零拷贝”,或许有帮助

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文