Skip to content
体验新版
项目
组织
正在加载...
登录
切换导航
打开侧边栏
m0_63117999
taskbus
提交
311faa37
taskbus
项目概览
m0_63117999
/
taskbus
与 Fork 源项目一致
Fork自
colorEagleStdio / taskbus
通知
1
Star
0
Fork
0
代码
文件
提交
分支
Tags
贡献者
分支图
Diff
Issue
0
列表
看板
标记
里程碑
合并请求
0
Wiki
0
Wiki
分析
仓库
DevOps
项目成员
Pages
taskbus
项目概览
项目概览
详情
发布
仓库
仓库
文件
提交
分支
标签
贡献者
分支图
比较
Issue
0
Issue
0
列表
看板
标记
里程碑
合并请求
0
合并请求
0
Pages
分析
分析
仓库分析
DevOps
Wiki
0
Wiki
成员
成员
收起侧边栏
关闭侧边栏
动态
分支图
创建新Issue
提交
Issue看板
前往新版Gitcode,体验更适合开发者的 AI 搜索 >>
提交
311faa37
编写于
12月 24, 2022
作者:
丁劲犇
😸
浏览文件
操作
浏览文件
下载
电子邮件补丁
差异文件
减少PCAP设备枚举时的文字长度,同时在出错后可继续工作。
上级
702804c0
变更
2
隐藏空白更改
内联
并排
Showing
2 changed file
with
167 addition
and
134 deletion
+167
-134
modules/sinks/sink_pcap/pcapio.cpp
modules/sinks/sink_pcap/pcapio.cpp
+50
-34
modules/sources/source_pcap/pcapio.cpp
modules/sources/source_pcap/pcapio.cpp
+117
-100
未找到文件。
modules/sinks/sink_pcap/pcapio.cpp
浏览文件 @
311faa37
...
...
@@ -28,18 +28,24 @@ namespace PCAPIO{
{
std
::
string
res
;
char
buf
[
1024
];
int
left_start
=
0
,
right_end
=
sizeof
(
sockaddr
::
sa_data
)
-
1
;
while
(
left_start
+
3
<
right_end
&&
v
[
left_start
]
==
0
)
++
left_start
;
while
(
left_start
+
3
<
right_end
&&
v
[
right_end
]
==
0
)
--
right_end
;
res
+=
"HEX("
;
for
(
unsigned
char
i
=
0
;
i
<
sizeof
(
sockaddr
::
sa_data
)
;
++
i
)
for
(
unsigned
char
i
=
left_start
;
i
<=
right_end
;
++
i
)
{
if
(
i
)
res
+=
":"
;
if
(
i
-
left_start
)
res
+=
":"
;
snprintf
(
buf
,
1024
,
"%02X"
,
(
unsigned
int
)
v
[
i
]);
res
+=
buf
;
}
res
+=
")"
;
res
+=
"DEC("
;
for
(
unsigned
char
i
=
0
;
i
<
sizeof
(
sockaddr
::
sa_data
)
;
++
i
)
for
(
unsigned
char
i
=
left_start
;
i
<=
right_end
;
++
i
)
{
if
(
i
)
res
+=
":"
;
if
(
i
-
left_start
)
res
+=
":"
;
snprintf
(
buf
,
1024
,
"%u"
,
(
unsigned
int
)
v
[
i
]
);
res
+=
buf
;
}
...
...
@@ -106,48 +112,58 @@ void pcap_sink::run()
{
if
(
m_bStop
)
return
;
using
namespace
TASKBUS
;
pcap_t
*
handle
=
NULL
;
char
errbuf
[
PCAP_ERRBUF_SIZE
];
handle
=
pcap_open_live
(
m_device
.
c_str
(),
65535
,
1
,
10
,
errbuf
);
if
(
handle
==
NULL
)
{
QString
err
=
QString
(
"pcap_open_live return err,errbuf:%1..."
).
arg
(
errbuf
);
emit
sig_message
(
err
);
return
;
}
bool
bQuit
=
false
;
m_tx
=
0
;
using
namespace
TASKBUS
;
while
(
false
==
m_bStop
)
{
subject_package_header
header
;
std
::
vector
<
unsigned
char
>
packagedta
=
pull_subject
(
&
header
);
if
(
!
is_valid_header
(
header
))
pcap_t
*
handle
=
NULL
;
char
errbuf
[
PCAP_ERRBUF_SIZE
];
handle
=
pcap_open_live
(
m_device
.
c_str
(),
65535
,
1
,
10
,
errbuf
);
if
(
handle
==
NULL
)
{
msleep
(
100
);
continue
;
QString
err
=
QString
(
"pcap_open_live return err,errbuf:%1..."
).
arg
(
errbuf
);
emit
sig_message
(
err
);
return
;
}
if
(
!
packagedta
.
empty
())
m_tx
=
0
;
while
(
false
==
m_bStop
)
{
if
(
is_control_subject
(
header
))
subject_package_header
header
;
std
::
vector
<
unsigned
char
>
packagedta
=
pull_subject
(
&
header
);
if
(
!
is_valid_header
(
header
))
{
//收到命令进程退出的广播消息,退出
if
(
strstr
((
const
char
*
)
packagedta
.
data
(),
"function=quit;"
)
!=
nullptr
)
{
fprintf
(
stderr
,
"Recived Quit Command."
);
fflush
(
stderr
);
m_bStop
=
true
;
bQuit
=
true
;
}
msleep
(
100
);
continue
;
}
else
if
(
header
.
subject_id
==
m_nSubject
)
if
(
!
packagedta
.
empty
()
)
{
pcap_sendpacket
(
handle
,
packagedta
.
data
(),
packagedta
.
size
());
++
m_tx
;
if
(
is_control_subject
(
header
))
{
//收到命令进程退出的广播消息,退出
if
(
strstr
((
const
char
*
)
packagedta
.
data
(),
"function=quit;"
)
!=
nullptr
)
{
fprintf
(
stderr
,
"Recived Quit Command."
);
fflush
(
stderr
);
m_bStop
=
true
;
bQuit
=
true
;
}
}
else
if
(
header
.
subject_id
==
m_nSubject
)
{
if
(
PCAP_ERROR
==
pcap_sendpacket
(
handle
,
packagedta
.
data
(),
packagedta
.
size
()))
{
fprintf
(
stderr
,
pcap_geterr
(
handle
));
fprintf
(
stderr
,
"
\n
"
);
fflush
(
stderr
);
break
;
}
++
m_tx
;
}
}
}
pcap_close
(
handle
);
}
pcap_close
(
handle
);
emit
sig_message
(
"Stopped"
);
if
(
bQuit
)
emit
quit_app
();
...
...
modules/sources/source_pcap/pcapio.cpp
浏览文件 @
311faa37
...
...
@@ -4,79 +4,85 @@
#include "tb_interface.h"
namespace
PCAPIO
{
std
::
string
ifaddresses
(
pcap_if_t
*
d
);
std
::
string
ifaddresses
(
pcap_if_t
*
d
);
std
::
string
pcapio_interfaces
(
std
::
map
<
std
::
string
,
std
::
string
>
&
devmap
)
{
std
::
string
res
;
pcap_if_t
*
alldevs
;
char
errbuf
[
PCAP_ERRBUF_SIZE
];
if
(
pcap_findalldevs
(
&
alldevs
,
errbuf
)
==
-
1
){
res
=
errbuf
;
return
res
;
}
for
(
auto
d
=
alldevs
;
d
!=
NULL
;
d
=
d
->
next
){
std
::
string
d_name
=
d
->
name
;
std
::
string
d_des
=
ifaddresses
(
d
);
devmap
[
d_name
]
=
d_des
;
}
pcap_freealldevs
(
alldevs
);
std
::
string
pcapio_interfaces
(
std
::
map
<
std
::
string
,
std
::
string
>
&
devmap
)
{
std
::
string
res
;
pcap_if_t
*
alldevs
;
char
errbuf
[
PCAP_ERRBUF_SIZE
];
if
(
pcap_findalldevs
(
&
alldevs
,
errbuf
)
==
-
1
){
res
=
errbuf
;
return
res
;
}
std
::
string
address_print
(
unsigned
char
*
v
)
{
std
::
string
res
;
char
buf
[
1024
];
res
+=
"HEX("
;
for
(
unsigned
char
i
=
0
;
i
<
sizeof
(
sockaddr
::
sa_data
);
++
i
)
{
if
(
i
)
res
+=
":"
;
snprintf
(
buf
,
1024
,
"%02X"
,
(
unsigned
int
)
v
[
i
]);
res
+=
buf
;
}
res
+=
")"
;
res
+=
"DEC("
;
for
(
unsigned
char
i
=
0
;
i
<
sizeof
(
sockaddr
::
sa_data
);
++
i
)
{
if
(
i
)
res
+=
":"
;
snprintf
(
buf
,
1024
,
"%u"
,
(
unsigned
int
)
v
[
i
]
);
res
+=
buf
;
}
res
+=
")"
;
for
(
auto
d
=
alldevs
;
d
!=
NULL
;
d
=
d
->
next
){
std
::
string
d_name
=
d
->
name
;
std
::
string
d_des
=
ifaddresses
(
d
);
devmap
[
d_name
]
=
d_des
;
}
return
res
;
pcap_freealldevs
(
alldevs
);
return
res
;
}
std
::
string
address_print
(
unsigned
char
*
v
)
{
std
::
string
res
;
char
buf
[
1024
];
int
left_start
=
0
,
right_end
=
sizeof
(
sockaddr
::
sa_data
)
-
1
;
while
(
left_start
+
3
<
right_end
&&
v
[
left_start
]
==
0
)
++
left_start
;
while
(
left_start
+
3
<
right_end
&&
v
[
right_end
]
==
0
)
--
right_end
;
res
+=
"HEX("
;
for
(
unsigned
char
i
=
left_start
;
i
<=
right_end
;
++
i
)
{
if
(
i
-
left_start
)
res
+=
":"
;
snprintf
(
buf
,
1024
,
"%02X"
,
(
unsigned
int
)
v
[
i
]);
res
+=
buf
;
}
res
+=
")"
;
res
+=
"DEC("
;
for
(
unsigned
char
i
=
left_start
;
i
<=
right_end
;
++
i
)
{
if
(
i
-
left_start
)
res
+=
":"
;
snprintf
(
buf
,
1024
,
"%u"
,
(
unsigned
int
)
v
[
i
]
);
res
+=
buf
;
}
/* Print all the available information on the given interface */
std
::
string
ifaddresses
(
pcap_if_t
*
d
)
res
+=
")"
;
return
res
;
}
/* Print all the available information on the given interface */
std
::
string
ifaddresses
(
pcap_if_t
*
d
)
{
char
buf
[
1024
];
pcap_addr_t
*
a
;
std
::
string
res
;
res
+=
d
->
name
;
res
+=
":"
;
if
(
d
->
description
)
{
char
buf
[
1024
];
pcap_addr_t
*
a
;
std
::
string
res
;
res
+=
d
->
name
;
res
+=
d
->
description
;
res
+=
":"
;
if
(
d
->
description
)
}
for
(
a
=
d
->
addresses
;
a
;
a
=
a
->
next
)
{
snprintf
(
buf
,
1024
,
"
\n
AF_0x%02X"
,(
unsigned
int
)
a
->
addr
->
sa_family
);
res
+=
buf
;
if
(
a
->
addr
)
{
res
+=
d
->
description
;
res
+=
":"
;
snprintf
(
buf
,
1024
,
"_%s"
,
address_print
((
unsigned
char
*
)
a
->
addr
->
sa_data
).
c_str
())
;
res
+=
buf
;
}
for
(
a
=
d
->
addresses
;
a
;
a
=
a
->
next
)
{
snprintf
(
buf
,
1024
,
"
\n
AF_0x%02X"
,(
unsigned
int
)
a
->
addr
->
sa_family
);
if
(
a
->
netmask
)
{
snprintf
(
buf
,
1024
,
"
/%s "
,
address_print
((
unsigned
char
*
)
a
->
netmask
->
sa_data
).
c_str
()
);
res
+=
buf
;
if
(
a
->
addr
)
{
snprintf
(
buf
,
1024
,
"_%s"
,
address_print
((
unsigned
char
*
)
a
->
addr
->
sa_data
).
c_str
());
res
+=
buf
;
}
if
(
a
->
netmask
)
{
snprintf
(
buf
,
1024
,
"/%s "
,
address_print
((
unsigned
char
*
)
a
->
netmask
->
sa_data
).
c_str
());
res
+=
buf
;
}
}
return
res
;
}
return
res
;
}
}
pcap_source
::
pcap_source
(
QObject
*
parent
)
...
...
@@ -106,49 +112,60 @@ void pcap_source::run()
{
if
(
m_bStop
)
return
;
pcap_t
*
handle
=
NULL
;
char
errbuf
[
PCAP_ERRBUF_SIZE
];
handle
=
pcap_open_live
(
m_device
.
c_str
(),
65535
,
1
,
10
,
errbuf
);
if
(
handle
==
NULL
)
{
QString
err
=
QString
(
"pcap_open_live return err,errbuf:%1..."
).
arg
(
errbuf
);
emit
sig_message
(
err
);
return
;
}
struct
bpf_program
filter
;
bpf_u_int32
net
=
0
;
int
ret32
=
pcap_compile
(
handle
,
&
filter
,
m_filter
.
c_str
(),
0
,
net
);
if
(
ret32
<
0
)
{
QString
err
=
QString
(
"pcap_compile return %1, errbuf:%2"
).
arg
(
ret32
).
arg
(
errbuf
);
emit
sig_message
(
err
);
pcap_close
(
handle
);
return
;
}
ret32
=
pcap_setfilter
(
handle
,
&
filter
);
if
(
ret32
<
0
)
{
QString
err
=
QString
(
"pcap_setfilter return %1, errbuf:%2"
).
arg
(
ret32
).
arg
(
errbuf
);
emit
sig_message
(
err
);
pcap_close
(
handle
);
return
;
}
const
u_char
*
packet
;
struct
pcap_pkthdr
header
;
//注意,要设置较大的缓存
pcap_set_buffer_size
(
handle
,
256
*
1024
*
1024
);
emit
sig_message
(
"Cap Started"
);
while
(
!
m_bStop
)
{
packet
=
pcap_next
(
handle
,
&
header
);
if
(
packet
)
pcap_t
*
handle
=
NULL
;
char
errbuf
[
PCAP_ERRBUF_SIZE
];
handle
=
pcap_open_live
(
m_device
.
c_str
(),
65535
,
1
,
10
,
errbuf
);
if
(
handle
==
NULL
)
{
QString
err
=
QString
(
"pcap_open_live return err,errbuf:%1..."
).
arg
(
errbuf
);
emit
sig_message
(
err
);
return
;
}
struct
bpf_program
filter
;
bpf_u_int32
net
=
0
;
int
ret32
=
pcap_compile
(
handle
,
&
filter
,
m_filter
.
c_str
(),
0
,
net
);
if
(
ret32
<
0
)
{
QString
err
=
QString
(
"pcap_compile return %1, errbuf:%2"
).
arg
(
ret32
).
arg
(
errbuf
);
emit
sig_message
(
err
);
pcap_close
(
handle
);
return
;
}
ret32
=
pcap_setfilter
(
handle
,
&
filter
);
if
(
ret32
<
0
)
{
QString
err
=
QString
(
"pcap_setfilter return %1, errbuf:%2"
).
arg
(
ret32
).
arg
(
errbuf
);
emit
sig_message
(
err
);
pcap_close
(
handle
);
return
;
}
const
u_char
*
packet
;
struct
pcap_pkthdr
header
;
//注意,要设置较大的缓存
pcap_set_buffer_size
(
handle
,
256
*
1024
*
1024
);
emit
sig_message
(
"Cap Started"
);
while
(
!
m_bStop
)
{
++
m_rx
;
if
(
m_nSubject
)
TASKBUS
::
push_subject
(
m_nSubject
,
m_nInstance
,
header
.
len
,(
unsigned
char
*
)
packet
);
packet
=
pcap_next
(
handle
,
&
header
);
if
(
packet
)
{
++
m_rx
;
if
(
m_nSubject
)
TASKBUS
::
push_subject
(
m_nSubject
,
m_nInstance
,
header
.
len
,(
unsigned
char
*
)
packet
);
}
else
{
fprintf
(
stderr
,
pcap_geterr
(
handle
));
fprintf
(
stderr
,
"
\n
"
);
fflush
(
stderr
);
break
;
}
}
pcap_close
(
handle
);
}
pcap_close
(
handle
);
emit
sig_message
(
"Cap Stopped"
);
}
编辑
预览
Markdown
is supported
0%
请重试
或
添加新附件
.
添加附件
取消
You are about to add
0
people
to the discussion. Proceed with caution.
先完成此消息的编辑!
取消
想要评论请
注册
或
登录