- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
我正在编写使用 PACKET_TX_RING 环发送 UDP 数据包的代码,但我不理解此处描述的示例代码: http://wiki.ipxwarzone.com/index.php5?title=Linux_packet_mmap#Kernel_Patch
/usr/src/linux/Documentation/networking/packet_mmap.txt说框架结构是这样的:
/* 框架结构:
填充以对齐 TPACKET_ALIGNMENT=16
*/
如果数据从 Start + tp_net 开始,那么为什么示例中的代码减去 sizeof(struct sockaddr_ll) 而不是求和,这是行:
/* get data offset */
data_offset = TPACKET_HDRLEN - sizeof(struct sockaddr_ll);
printf("data offset = %d bytes\n", data_offset);
计算出包数据指针后,复制数据:
// fill data
off = ((void *) header) + (TPACKET_HDRLEN - sizeof(struct sockaddr_ll));
memcpy(off, pkt, pktlen);
在我看来这像是数据损坏,套接字地址和可选的 mac 地址将被要传输的数据覆盖。就我而言,如果我使用此代码,UDP 数据包 header 将被覆盖,是否正确?
提前致谢
最佳答案
对不起,我来晚了。我遇到了同样的问题,不幸的是使用 PACKET_TX_RING 没有很好的记录。但幸运的是,使用链接的示例程序仍然很容易理解。
首先,您需要 tshark(或 wireshark)和您发布的链接中的 packet_mm 源。示例源用 0 到 150 填充缓冲区,然后将其直接发送到给定设备。使用 tshark 我们将读出发送的内容。
在一个 shell 中运行 tshark(点击环回设备):
$ tshark -V -i lo
并在另一个 shell 中运行 packet_mm:
$ packet_mm lo
查看一帧:
Frame 1 (150 bytes on wire, 150 bytes captured)
Arrival Time: Nov 12, 2011 13:07:02.636424000
[Time delta from previous captured frame: 0.000005000 seconds] [Time delta from previous displayed frame: 0.000005000 seconds]
[Time since reference or first frame: 337.280499000 seconds]
Frame Number: 1001
Frame Length: 150 bytes
Capture Length: 150 bytes
[Frame is marked: False]
[Protocols in frame: eth:data]
Ethernet II, Src: 06:07:08:09:0a:0b (06:07:08:09:0a:0b), Dst: 3com_03:04:05 (00:01:02:03:04:05)
Destination: 3com_03:04:05 (00:01:02:03:04:05)
Address: 3com_03:04:05 (00:01:02:03:04:05)
.... ...0 .... .... .... .... = IG bit: Individual address (unicast)
.... ..0. .... .... .... .... = LG bit: Globally unique address (factory default)
Source: 06:07:08:09:0a:0b (06:07:08:09:0a:0b)
Address: 06:07:08:09:0a:0b (06:07:08:09:0a:0b)
.... ...0 .... .... .... .... = IG bit: Individual address (unicast)
.... ..1. .... .... .... .... = LG bit: Locally administered address (this is NOT the factory default)
Type: Unknown (0x0c0d)
Data (136 bytes)
0000 0e 0f 10 11 12 13 14 15 16 17 18 19 1a 1b 1c 1d ................
0010 1e 1f 20 21 22 23 24 25 26 27 28 29 2a 2b 2c 2d .. !"#$%&'()*+,-
0020 2e 2f 30 31 32 33 34 35 36 37 38 39 3a 3b 3c 3d ./0123456789:;<=
0030 3e 3f 40 41 42 43 44 45 46 47 48 49 4a 4b 4c 4d >?@ABCDEFGHIJKLM
0040 4e 4f 50 51 52 53 54 55 56 57 58 59 5a 5b 5c 5d NOPQRSTUVWXYZ[\]
0050 5e 5f 60 61 62 63 64 65 66 67 68 69 6a 6b 6c 6d ^_`abcdefghijklm
0060 6e 6f 70 71 72 73 74 75 76 77 78 79 7a 7b 7c 7d nopqrstuvwxyz{|}
0070 7e 7f 80 81 82 83 84 85 86 87 88 89 8a 8b 8c 8d ~...............
0080 8e 8f 90 91 92 93 94 95 ........
Data: 0E0F101112131415161718191A1B1C1D1E1F202122232425...
[Length: 136]
目标 MAC 为 00:01:02:03:04:05,源 MAC 为 06:07:08:09:0a:0b。数据以 0x0e (14) 开始(紧跟在以太网报头之后)。
因此示例程序的数据偏移量是要发送的(以太网)数据包的开始。
所以这确实是填充发送缓冲区的正确方法(确保 pktlen 不大于您的帧大小):
// fill data
off = ((uint8_t *) header) + (TPACKET_HDRLEN - sizeof(struct sockaddr_ll));
memcpy(off, pkt, pktlen);
并且不会覆盖任何数据。但是您必须自己提供以太网、IP 和 UDP header 。
编辑:对于 TX_Ring,帧结构似乎是:
关于linux - PACKET_MMAP 数据偏移量,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7768844/
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,
Linux 管道可以缓冲多少数据?这是可配置的吗? 如果管道的两端在同一个进程中,但线程不同,这会有什么不同吗? 请注意:这个“同一个进程,两个线程”的问题是理论上的边栏,真正的问题是关于缓冲的。 最
我找到了here [最后一页] 一种有趣的通过 Linux 启动 Linux 的方法。不幸的是,它只是被提及,我在网上找不到任何有用的链接。那么有人听说过一种避免引导加载程序而使用 Linux 的方法
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
我试图了解 ld-linux.so 如何在 Linux 上解析对版本化符号的引用。我有以下文件: 测试.c: void f(); int main() { f(); } a.c 和 b.c:
与 RetroPie 的工作原理类似,我可以使用 Linux 应用程序作为我的桌面环境吗?我实际上并不需要像实际桌面和安装应用程序这样的东西。我只需要一种干净简单的方法来在 RaspberryPi 上
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 10 年前。 Improve thi
有什么方法可以覆盖现有的源代码,我应该用 PyQt、PyGTK、Java 等从头开始构建吗? 最佳答案 如果您指的是软件本身而不是它所连接的存储库,那么自定义应用程序的方法就是 fork 项目。据我所
我的情况是:我在一个磁盘上安装了两个 linux。我将第一个安装在/dev/sda1 中,然后在/dev/sda2 中安装第二个然后我运行第一个系统,我写了一个脚本来在第一个系统运行时更新它。
我在 i2c-0 总线上使用地址为 0x3f 的系统监视器设备。该设备在设备树中配置有 pmbus 驱动程序。 问题是,加载 linux 内核时,这个“Sysmon”设备没有供电。因此,当我在总线 0
关闭。这个问题是off-topic .它目前不接受答案。 想改进这个问题吗? Update the question所以它是on-topic用于堆栈溢出。 关闭 11 年前。 Improve thi
我正试图在 linux 模块中分配一大块内存,而 kalloc 做不到。 我知道唯一的方法是使用 alloc_bootmem(unsigned long size) 但我只能从 linux 内核而不是
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 这个问题似乎不是关于 a specific programming problem, a softwar
我有 .sh 文件来运行应用程序。在该文件中,我想动态设置服务器名称,而不是每次都配置。 我尝试了以下方法,它在 CentOS 中运行良好。 nohup /voip/java/jdk1.8.0_71/
我是在 Linux 上开发嵌入式 C++ 程序的新手。我有我的 Debian 操作系统,我在其中开发和编译了我的 C++ 项目(一个简单的控制台进程)。 我想将我的应用程序放到另一个 Debian 操
关闭。这个问题需要多问focused 。目前不接受答案。 想要改进此问题吗?更新问题,使其仅关注一个问题 editing this post . 已关闭 4 年前。 Improve this ques
我使用4.19.78版本的稳定内核,我想找到带有企鹅二进制数据的C数组。系统启动时显示。我需要在哪里搜索该内容? 我在 include/linux/linux_logo.h 文件中只找到了一些 Log
我知道可以使用 gdb 的服务器模式远程调试代码,我知道可以调试针对另一种架构交叉编译的代码,但是是否可以更进一步,从远程调试 Linux 应用程序OS X 使用 gdbserver? 最佳答案 当然
是否有任何可能的方法来运行在另一个 Linux 上编译的二进制文件?我知道当然最简单的是在另一台机器上重建它,但假设我们唯一能得到的是一个二进制文件,那么这可能与否? (我知道这可能并不容易,但我只是
我是一名优秀的程序员,十分优秀!