您的位置:首页 > 编程语言 > Qt开发

QT5.2+Wireshark的pipe通讯问题

2016-06-03 13:45 465 查看
这几天一直在做QT5.2+wireshark之间的通讯时用过pipe进行的,wireshark本身是作为pipe服务端的,QT端只要对wireshark的pipe进行连接就可以了,但是QT对pipe没有进行专门的封装,所以我们需要使用Windows API进行连接,QT使用Windows API时,需要加头文件,
#include
<windows.h>
并在工程文件中加

LIBS     += -lgdi32

这样就可以在QT中使用Windows API了,连接wireshark的pipe使用下面的代码:

void frmMain::on_openwshButton_clicked()

{

//HANDLE hPipe;

ShellExecute(0,L"open",

L"D:\\Program Files\\Wireshark\\Wireshark.exe",

L"-i \\\\.\\pipe\\wireshark0 -k",NULL,SW_SHOWNORMAL);

hPipe = CreateNamedPipe(

L"\\\\.\\pipe\\wireshark0",

PIPE_ACCESS_OUTBOUND,

PIPE_TYPE_MESSAGE | PIPE_WAIT,

1, 65536, 65536,

300,

NULL);

if (hPipe == INVALID_HANDLE_VALUE) {

printf("Pipe open error!\r\n");

//return 0;

}

ConnectNamedPipe(hPipe, NULL);

// 发送文件头

DWORD cbWritten = 0;

WriteFile(hPipe,&__GtPipeFileHeader, sizeof(__GtPipeFileHeader), &cbWritten, NULL);

}

为了使wireshark可以识别出来我们发送的数据是IEEE802.15.4协议的数据包,需要在pipe连接成功后发送一个pipe文件头格式

我定义的pipe结构体如下:

typedef struct {

DWORD32 magic_number;        // 4 Magic编号	固定为0xA1B2C3D4

WORD version_major;       // 2 主版本号	固定为2

WORD version_minor;       // 2 监控版本号	固定为4

DWORD32 thiszone;            // 4 GMT to local correction	固定为0

DWORD32 sigfigs;             // 4 是否需要精确的时间戳	建议设置为0

DWORD32 snaplen;             // 4 抓到的包最大长度	建议设置为65535

DWORD32 network;             // 4 链路层编号	对于IEEE802.15.4,固定为195

}tPipeFileHeader;


在串口接收到的数据中将实际需要的数据包截取出来,注意在QT中需要用quint8/quint16/quint32这样格式的数组格式进行pipe数据传输,不然wireshark会解析错误的。我在QT串口中是这样做到的:

//读串口

void frmMain::ReadMyCom()

{

//这个判断尤为重要,否则的话直接延时再接收数据,空闲时会出现高内存占用

if (myCom->bytesAvailable()<=0)

{

return;

}

else

{


//myHelper::Sleep(50);//延时100毫秒保证接收到的是一条完整的数据,而不是脱节的

requestdata=myCom->readAll();

quint8 buf[512];

for(int i=0;i<requestdata[5]-2;i++)

{

buf[i]=requestdata[7+i];

}

WritePipeFrameHeader(hPipe,requestdata[5]-2);

WritePipeFrameData(hPipe,(void *)&buf[0],requestdata[5]-2);

}

}

这样在wireshark中就会识别出来这个数据包了:


至此,QT+wireshark的通讯就完成了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: