QT5.2+Wireshark的pipe通讯问题

来源:互联网 发布:北美免费海关数据 编辑:程序博客网 时间:2024/06/02 02:28
这几天一直在做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的通讯就完成了。


0 0
原创粉丝点击