关于C语言提取数据包问题

q364287899 2012-08-21 04:36:40
现有一堆数据包存放在一个文本文档里。我想从中提取第一给数据包该怎么做。c语言。每个数据包的大小都不相同。
其中一部分数据包如下:
2009-06-18 17:18:19.153487 10:23:45:67:89:ab (oui Unknown) > 00:0d:61:a6:5c:ea (oui Unknown), ethertype ARP (0x0806), length 42: arp reply 192.168.2.6 is-at 10:23:45:67:89:ab (oui Unknown)
0x0000: 0001 0800 0604 0002 1023 4567 89ab c0a8 .........#Eg....
0x0010: 0206 000d 61a6 5cea c0a8 0216 ....a.\.....
2009-06-18 17:18:19.153755 00:0d:61:a6:5c:ea (oui Unknown) > 10:23:45:67:89:ab (oui Unknown), ethertype IPv4 (0x0800), length 78: (tos 0x0, ttl 64, id 35993, offset 0, flags [DF], proto: TCP (6), length: 64) 192.168.2.22.1212 > 192.168.2.6.80: S 3553733642:3553733642(0) win 65535 <mss 1460,nop,wscale 2,nop,nop,timestamp[|tcp]>
0x0000: 4500 0040 8c99 4000 4006 28b2 c0a8 0216 E..@..@.@.(.....
0x0010: c0a8 0206 04bc 0050 d3d1 ac0a 0000 0000 .......P........
0x0020: b002 ffff 2baa 0000 0204 05b4 0103 0302 ....+...........
0x0030: 0101 080a 0000 ......
2009-06-18 17:18:19.154349 10:23:45:67:89:ab (oui Unknown) > 00:0d:61:a6:5c:ea (oui Unknown), ethertype IPv4 (0x0800), length 74: (tos 0x0, ttl 64, id 0, offset 0, flags [DF], proto: TCP (6), length: 60) 192.168.2.6.80 > 192.168.2.22.1212: S 2306474322:2306474322(0) ack 3553733643 win 5792 <mss 1460,sackOK,timestamp 4294936398[|tcp]>
0x0000: 4500 003c 0000 4000 4006 b54f c0a8 0206 E..<..@.@..O....
0x0010: c0a8 0216 0050 04bc 897a 0152 d3d1 ac0b .....P...z.R....
0x0020: a012 16a0 14e5 0000 0204 05b4 0402 080a ................
0x0030: ffff 874e 0000 ...N..
2009-06-18 17:18:19.154647 00:0d:61:a6:5c:ea (oui Unknown) > 10:23:45:67:89:ab (oui Unknown), ethertype IPv4 (0x0800), length 66: (tos 0x0, ttl 64, id 35995, offset 0, flags [DF], proto: TCP (6), length: 52) 192.168.2.22.1212 > 192.168.2.6.80: ., cksum 0x7de9 (correct), ack 1 win 64240 <nop,nop,timestamp 6873352 4294936398>
0x0000: 4500 0034 8c9b 4000 4006 28bc c0a8 0216 E..4..@.@.(.....
0x0010: c0a8 0206 04bc 0050 d3d1 ac0b 897a 0153 .......P.....z.S
0x0020: 8010 faf0 7de9 0000 0101 080a 0068 e108 ....}........h..
0x0030: ffff 874e ...N
...全文
1282 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
xspace_time 2012-08-21
  • 打赏
  • 举报
回复
先用正则找到192.168.2.6.80//80是QQ端口 然后循环4次取数据包
q364287899 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]
(0x[0-9]{0,4}):.*循环4次
[/Quote]
麻烦在说清楚点呗 小弟初学
q364287899 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 的回复:]
引用 8 楼 的回复:
引用 4 楼 的回复:

仅供参考C/C++ code
#include <stdio.h>
int n,r;
int d;
FILE *f;
void main() {
f=fopen("d.txt","r");
n=0;
while (1) {
r=fscanf(f,"%4x",&amp;amp;d);
if (1==r) {
n++……
[/Quote]
我的意思是就是对第一个数据包进行分析 假如说它是QQ的包 那么之后就把它整个包拷入qq.txt中 源文件不变 现在就是想将这样一个包从这一大堆包中取出来
xspace_time 2012-08-21
  • 打赏
  • 举报
回复
(0x[0-9]{0,4}):.*循环4次
赵4老师 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]
引用 4 楼 的回复:

仅供参考C/C++ code
#include <stdio.h>
int n,r;
int d;
FILE *f;
void main() {
f=fopen("d.txt","r");
n=0;
while (1) {
r=fscanf(f,"%4x",&amp;d);
if (1==r) {
n++;
……

貌似没明白我的问……
[/Quote]
例子代码取出d.txt文件中所有4位十六进制数(自动跳过其它字符串)。
对楼主的问题难道没有帮助吗?
q364287899 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]
用tcpdump -w取出来看看是什么样子吧。
二进制IP包的也很好分析。

简单说明一下:
第24字节表示传输层协议。06:TCP、11:UDP
第35、36字节表示源端口号
第37、38字节表示目的端口号
[/Quote]
这个知道 但是给我的就是这种格式的 让我对这些个数据包进行分类啊
aozhi 2012-08-21
  • 打赏
  • 举报
回复
用tcpdump -w取出来看看是什么样子吧。
二进制IP包的也很好分析。

简单说明一下:
第24字节表示传输层协议。06:TCP、11:UDP
第35、36字节表示源端口号
第37、38字节表示目的端口号
aozhi 2012-08-21
  • 打赏
  • 举报
回复
别用tcpdump -X取。这样格式太乱,网络压力大时还容易丢包。
还不如tcpdump -w直接取二进制的了。
q364287899 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 的回复:]

仅供参考C/C++ code
#include <stdio.h>
int n,r;
int d;
FILE *f;
void main() {
f=fopen("d.txt","r");
n=0;
while (1) {
r=fscanf(f,"%4x",&d);
if (1==r) {
n++;
……
[/Quote]
貌似没明白我的问题把 大哥
q364287899 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

长度不定,那只能通过读取,分析,找到头尾,然后COPY出来咯,应该有约定好的格式的吧,方法是很简单的,只是比较繁琐,要判断各种情况。
[/Quote]
数据包中的length值用不到吗?
q364287899 2012-08-21
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 的回复:]

数据包开始都是2009-06-18 17:18:19这种形式的嘛。。
[/Quote]

是的 都是
小默 2012-08-21
  • 打赏
  • 举报
回复
长度不定,那只能通过读取,分析,找到头尾,然后COPY出来咯,应该有约定好的格式的吧,方法是很简单的,只是比较繁琐,要判断各种情况。
赵4老师 2012-08-21
  • 打赏
  • 举报
回复
仅供参考
#include <stdio.h>
int n,r;
int d;
FILE *f;
void main() {
f=fopen("d.txt","r");
n=0;
while (1) {
r=fscanf(f,"%4x",&d);
if (1==r) {
n++;
printf("[%d]==%04x\n",n,d);
} else if (0==r) {
fgetc(f);
} else break;
}
fclose(f);
}
Gloveing 2012-08-21
  • 打赏
  • 举报
回复
数据包开始都是2009-06-18 17:18:19这种形式的嘛。。
q364287899 2012-08-21
  • 打赏
  • 举报
回复
正则表达式? 该怎么做啊 小弟初学啊 说明白点呗 麻烦了
Gloveing 2012-08-21
  • 打赏
  • 举报
回复
提取第一个数据包?
使用正则表达式

69,745

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧