时,错误为代码>文件结束。,c++,linux,pipe,wireshark,popen,C++,Linux,Pipe,Wireshark,Popen" /> 时,错误为代码>文件结束。,c++,linux,pipe,wireshark,popen,C++,Linux,Pipe,Wireshark,Popen" />

打开期间管道魔术上的文件结束 我有一个C++应用程序,在这个程序中我开始了另一个进程(WiReSARK)。 if (fp == NULL){ fp = popen(processpath, "r"); //processpath is the process I want to start if (!fp){ throw std::invalid_argument("Cannot start process"); } fprintf(fp, d_msg);//d_msg is the input I want to provide to process } else if(fp != NULL){ fprintf(fp, d_msg); } 问题是当我执行C++应用程序时,它在WixRebug中启动WiReSARK,但在打开< < /P>时,错误为代码>文件结束。

打开期间管道魔术上的文件结束 我有一个C++应用程序,在这个程序中我开始了另一个进程(WiReSARK)。 if (fp == NULL){ fp = popen(processpath, "r"); //processpath is the process I want to start if (!fp){ throw std::invalid_argument("Cannot start process"); } fprintf(fp, d_msg);//d_msg is the input I want to provide to process } else if(fp != NULL){ fprintf(fp, d_msg); } 问题是当我执行C++应用程序时,它在WixRebug中启动WiReSARK,但在打开< < /P>时,错误为代码>文件结束。,c++,linux,pipe,wireshark,popen,C++,Linux,Pipe,Wireshark,Popen,我应该做些什么来避免这种情况 我还尝试使用mkfifo创建一个命名管道并执行它。我用了这样的方法: if (fp == NULL){ system("mkfifo /tmp/mine.pcap"); fp = popen("wireshark -k -i /tmp/mine.pcap", "r"); if (!fp){ dout << "Cannot start wireshark"<<std::endl; t

我应该做些什么来避免这种情况

我还尝试使用mkfifo创建一个命名管道并执行它。我用了这样的方法:

   if (fp == NULL){
    system("mkfifo /tmp/mine.pcap");
    fp = popen("wireshark -k -i /tmp/mine.pcap", "r");
    if (!fp){
        dout << "Cannot start wireshark"<<std::endl;
        throw std::invalid_argument("Cannot start wireshark");      
    }
    input = fopen("/tmp/mine.pcap", "wb");
    fprintf(input , d_msg);
    fclose(input);
} else if(fp != NULL){
    input = fopen("/tmp/mine.pcap", "wb");
    fprintf(input , d_msg);
    fclose(input);
}
if(fp==NULL){
系统(“mkfifo/tmp/mine.pcap”);
fp=popen(“wireshark-k-i/tmp/mine.pcap”,“r”);
如果(!fp){
阴郁的
<>问题是当我执行C++应用程序时,它在WixRebug中启动WiReSARK,但在打开< <代码> < /P>时,错误为<>代码>文件结束。
我应该做些什么来避免这种情况

你应该在管道上写a或a,而不是打印一些东西


这两种文件格式都是二进制的。如果要构造自己的数据包,则必须构造一个有效的pcap文件头或几个有效的pcap ng块(节头块和至少一个接口描述块)并将其写入管道在您可以写入任何数据包之前,然后,对于每个数据包,您必须在之前(对于增强数据块,在之后)写入每个数据包pcap报头或pcap ng增强数据包块的开始和结束原始数据包数据。如果您只是将现有文件发送到Wireshark,则需要从文件中读取原始字节,然后将这些原始字节发送到管道。

您已经看到,您使用
“r”
打开管道,即,用于读取而不是写入?您打开管道进行读取并向其打印某些内容。“您可以打开管道进行读取并打印内容。”如果您要将管道连接到Wireshark正在捕获的命名管道,则不需要,因为您必须将a或a写入Wireshark,并且这两个文件都不是文本文件。感谢大家的输入。Doesnt
”r“使管道的一端可读,另一端写的可能是错误的。”GuyHARRIS:实际上我在我的C++应用程序中有PCAP头,我想直接传递到WiReSARK。所以我应该创建一个pCAP文件(用页眉等),然后做MKFIFP并用它来写数据包“No.NT”R?“使管道的一端可读,另一端可写?”是的,但从
popen()
获得的一端将只可读,而不可写。如果使用“w”打开",你得到了可写端。足够清楚了。我正在用所有的。构造有效的pcap头和pcap文件头。我正在提供它们中的每一个。然后我也遇到了同样的问题。也许我会再次检查并在这里再次问,这样可以吗?Radiotap头?然后
d_link
必须是127;如果不是127,那就不起作用。还有,确保结构中的所有字段都具有适当的大小;例如,不要对大小使用
long
unsigned long
,因为在64位系统上可能是64位的。
fp=popen(“wireshark-k-i-”,“r”);
应该是
fp=popen(“wireshark-i-”,“w”);
,当您试图写入Wireshark而不是从Wireshark读取时(如果您想从管道读取解密的数据包,请使用TShark,而不是Wireshark)<代码> dyMSG不应该是<代码> char */COD>,因为在管道上WiRESHARK上写的不是文本字符,它们是二进制字节。如果C++中使用了这些代码,则应该是<代码> UTI8GYT < /代码>。您应该用“代码> fWreWe())/<代码>编写它,而不是<代码> fPrftf()。
,因为它不是格式字符串或其他形式的文本。您得到的可能是
第5帧太长(NNN字节)
,对于某些值“NNN”。“NNN”是dumpcap在每个数据包头(
hdr->incl_len
)中读取为数据包“捕获长度”的内容,并且必须是