提交 311faa37 编写于 作者: 丁劲犇's avatar 丁劲犇 😸

减少PCAP设备枚举时的文字长度,同时在出错后可继续工作。

上级 702804c0
......@@ -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();
......
......@@ -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,"\nAF_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,"\nAF_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.
先完成此消息的编辑!
想要评论请 注册