- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有这段代码可以很好地使用 libpcap 编写 pcap 文件(仅使用用于测试的以太网协议(protocol)):
struct ethernet {
u_char mac1[6];
u_char mac2[6];
u_short protocol;
};
int main() {
pcap_t *pd;
pcap_dumper_t *pdumper;
pd = pcap_open_dead(DLT_EN10MB, 65535);
pdumper = pcap_dump_open(pd, "test.pcap");
struct pcap_pkthdr packet_header;
struct timeval ts;
packet_header.ts = ts;
packet_header.caplen = sizeof(struct ethernet);
packet_header.len = sizeof(struct ethernet);
struct ethernet ethernet;
bzero(ethernet.mac1, 6);
bzero(ethernet.mac2, 6);
ethernet.protocol = 8977; // randomly choose
pcap_dump((u_char*)pdumper, &packet_header, (const u_char*)ðernet);
pcap_close(pd);
pcap_dump_close(pdumper);
return 0;
}
但是我想尽量不用pcap函数,所以我开始decorticate上面用到的函数。
以下是我找到的资源:
pcap_open_dead 函数:http://www.wand.net.nz/trac/libtrace/browser/lib/pcap_open_dead.c?rev=808a478a2459f3cf0e8bf927fcaad371138efb20
pcap_dump_open、pcap_dump 和其他:http://www.opensource.apple.com/source/libpcap/libpcap-2.1/libpcap/savefile.c
所以,这是我的想法:
pcap_open_dead 函数有点无用,只是实例化一个 pcap_t 结构(我不想在我的代码中使用它)并用参数填充它的值。
pcap_dump_open 返回一个 pcap_dumper_t(看起来就像一个 FILE*),只是打开文件并在其中写入文件头(如果我们不关心错误处理)。顺便说一句,它似乎将“p->tzoff”作为参数传递给 sf_write_header,它尚未在我的代码中初始化(但它仍在工作)。关于链接类型,在我们的例子中它正好等于 1。
最后,pcap_dump 函数将 pcap_dumper_t 变量作为第一个参数,隐式转换为 u_char*,然后显式转换为 FILE*(为什么不从一开始就使用 FILE*?)然后用fwrite把一个包头和一个包数据写入文件。
这就是我所做的:
FILE *fd = fopen("test.pcap", "w");
struct pcap_file_header header;
header.magic = 0xa1b2c3d4;
header.version_major = 2;
header.version_minor = 4;
header.thiszone = 0;
header.sigfigs = 0;
header.snaplen = 65535;
header.linktype = DLT_EN10MB;
struct pcap_pkthdr packet_header;
struct timeval ts;
packet_header.ts = ts;
packet_header.caplen = sizeof(struct ethernet);
packet_header.len = sizeof(struct ethernet);
struct ethernet ethernet;
bzero(ethernet.mac1, 6);
bzero(ethernet.mac2, 6);
ethernet.protocol = 8977;
fwrite((char*)&header, sizeof(header), 1, fd);
fwrite((char*)&packet_header, sizeof(struct pcap_pkthdr), 1, fd);
fwrite((char*)ðernet, sizeof(struct ethernet), 1, fd);
close(fd);
不需要使用pcap_t结构,我直接把snaplen和linktype值放在pcap_file_header结构中。
然后我像在 pcap 函数中一样使用 fwrite。
头文件很好,只要在文件中写入头文件就可以用wireshark打开文件。但是当我添加 2 最后一个 fwrite(写入数据包 header 和数据包)时,wireshark 告诉我:
The capture file appears to be damaged or corrupt.
(pcap: File has 4195245-byte packet, bigger than maximum of 65535)
我找不到我的错误在哪里,我不知道他在哪里看到那么多字节。
编辑
我没有使用未初始化的时间间隔,而是:
packet_header.ts = (struct timeval){0};
现在可以正常工作了,但是您如何解释它在使用 pcap 函数时可以正常工作? “ts”仍未初始化。
这个时间间隔是什么意思?将其设置为零是否有意义?
编辑:将魔数(Magic Number)更正为 0xa1b2c3d4
最佳答案
struct pcap_pkthdr packet_header;
这是提供给程序的包头格式。它不一定是存储在文件中的数据包 header 的格式;它包含一个 struct timeval
,其大小取决于是否 time_t
是 32 位还是 64 位。
你需要的是:
struct pcap_timeval {
bpf_int32 tv_sec; /* seconds */
bpf_int32 tv_usec; /* microseconds */
};
struct pcap_sf_pkthdr {
struct pcap_timeval ts; /* time stamp */
bpf_u_int32 caplen; /* length of portion present */
bpf_u_int32 len; /* length this packet (off wire) */
};
并使用struct pcap_sf_pkthdr
反而。写作 struct pcap_pkthdr
文件的结构将在任何系统上产生无效的 pcap 文件 tv_sec
或 tv_usec
领域struct timeval
不是 32 位;在任何 64 位系统上可能都是这种情况。在这种情况下,您很可能会遇到类似“已损坏或已损坏”的错误。
至于时间戳的含义,在实际捕获中,它表示数据包被捕获代码路径的任何部分看到时间戳的时间,这是对时间的近似值数据包到达捕获它的机器。这是一个 UN*X 时间戳,所以 tv_sec
是自 1970 年 1 月 1 日 00:00:00 UTC 以来的秒数,tv_usec
是从那一秒开始的微秒计数。
关于c - 如何从头开始编写 pcap 文件,decorticating libpcap 函数?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33522705/
我只想从客户端向服务器发送数组 adc_array=[w, x, y, z]。下面是客户端代码,而我的服务器是在只接受 json 的 python 中。编译代码时我没有收到任何错误,但收到 2 条警告
我是 lua 和 Node js 的新手,我正在尝试将我正在开发的移动应用程序连接到服务器。问题是它连接到服务器,但我尝试传递的数据丢失或无法到达服务器。对我正在做的事情有什么问题有什么想法吗? th
我在这个页面上工作 http://www.haskell.org/haskellwiki/99_questions/Solutions/4 我理解每个函数的含义,看到一个函数可以像这样以多种方式定义,
我目前正在尝试将数据写入 excel 以生成报告。我可以将数据写入 csv 文件,但它不会按照我想要的顺序出现在 excel 中。我需要数据在每列的最佳和最差适应性下打印,而不是全部打印在平均值下。这
所以,我正在做一个项目,现在我有一个问题,所以我想得到你的帮助:) 首先,我已经知道如何编写和读取 .txt 文件,但我想要的不仅仅是 x.hasNext()。 我想知道如何像 .ini 那样编写、读
我正在尝试编写一个函数,该函数将返回作为输入给出的任何数字的阶乘。现在,我的代码绝对是一团糟。请帮忙。 function factorialize(num) { for (var i=num, i
这个问题已经有答案了: Check variable equality against a list of values (16 个回答) 已关闭 4 年前。 有没有一种简洁或更好的方法来编写这个条件
我对 VR 完全陌生,正在 AFrame 中为一个类(class)项目开发 VR 太空射击游戏,并且想知道 AFrame 中是否有 TDD 的任何文档/标准。有人能指出我正确的方向吗? 最佳答案 几乎
我正在尝试创建一个 for 循环,它将重现以下功能代码块,但以一种更具吸引力的方式。这是与 Soundcould 小部件 API 实现一起使用的 here on stackoverflow $(doc
我有一个非常令人困惑的问题。我正在尝试更改属性文件中的属性,但它只是没有更改... 这是代码: package config; import java.io.FileNotFoundException
我对 VR 完全陌生,正在 AFrame 中为一个类(class)项目开发 VR 太空射击游戏,并且想知道 AFrame 中是否有 TDD 的任何文档/标准。有人能指出我正确的方向吗? 最佳答案 几乎
我正在开发一个用户模式(Ring3)代码级调试器。它还应支持.NET可执行文件的本机(x86)调试。基本上,我需要执行以下操作: 1).NET在隐身模式下加载某些模块,而没有LOAD_DLL_DEBU
我有一个列表,我知道有些项目是不必要打印的,我正在尝试通过 if 语句来做到这一点...但是它变得非常复杂,所以有没有什么方法可以在 if 语句中包含多个索引而无需打印重写整个声明。 看起来像这样的东
我很好奇以不同方式编写 if 语句是否会影响程序的速度和效率。所以,例如写一个这样的: bool isActive = true; bool isResponding = false; if (isA
我在搜索网站的源代码时找到了一种以另一种方式(我认为)编写 if 语句的方法。 代替: if(a)b; 或: a?b:''; 我读了: !a||b; 第三种方式和前两种方式一样吗?如果是,为什么我们要
我的数据采用以下格式(HashMap的列表) {TeamName=India, Name=Sachin, Score=170} {TeamName=India, Name=Sehwag, Score=
我目前正在完成 More JOIN operations sqlzoo 的教程,遇到了下面的代码作为#12 的答案: SELECT yr,COUNT(title) FROM movie JOIN ca
我正试图找到一种更好的方法来编写这段代码: def down_up(array, player) 7.downto(3).each do |row| 8.times do |col
出于某种原因,我的缓冲区中充满了乱码,我不确定为什么。我什至用十六进制编辑器检查了我的文件,以验证我的字符是否以 2 字节的 unicode 格式保存。我不确定出了什么问题。 [打开文件] fseek
阅读编码恐怖片时,我刚刚又遇到了 FizzBuzz。 原帖在这里:Coding Horror: Why Can't Programmers.. Program? 对于那些不知道的人:FizzBu
我是一名优秀的程序员,十分优秀!