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>
并在工程文件中加
这样就可以在QT中使用Windows API了,连接wireshark的pipe使用下面的代码:
为了使wireshark可以识别出来我们发送的数据是IEEE802.15.4协议的数据包,需要在pipe连接成功后发送一个pipe文件头格式
我定义的pipe结构体如下:
在串口接收到的数据中将实际需要的数据包截取出来,注意在QT中需要用quint8/quint16/quint32这样格式的数组格式进行pipe数据传输,不然wireshark会解析错误的。我在QT串口中是这样做到的:
至此,QT+wireshark的通讯就完成了。
#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的通讯就完成了。
相关文章推荐
- qt 事件 详细解释
- VS2010+QT5.1+opencv2.4.5图像界面第一个程序(改了一些,现在QT5.4,OPENCV2.4.10)
- qt拖放 控件之间拖放 自定义数据
- QTreeView处理大量数据
- qt dnd drag and drop 拖放
- Qt学习之路(60): 创建dll
- vs2010编译64位qt5.5
- Qt Model/View 构架
- Qt学习笔记:Signal & Slot
- Qt Write and Read XML File 读写XML文件
- Qt官方开发环境生成的exe发布方式--使用windeployqt
- Qt实现停靠功能
- Qt的QWaitCondition(允许线程在一定条件下唤醒其他线程,这样对不间断上传可能比较适用)
- VS2015+OpenCV2.4.9+Qt5.6安装配置
- Qt对话框_模态/非模态
- QT窗口置顶/真透明/背景模糊/非矩形/跳过任务栏分页器/无边框/无焦点点击/焦点穿透
- Qt中文件操作遇到的(变量,容器,结构体)
- Qt中所有类型之间的转换
- QTP(UFT)只能录制窗口的操作,不能录制窗口中对象的操作
- Qt自定义委托在QTableView中绘制控件、图片、文字