1

我正在使用 PcapDot.Net 项目 Dlls 发送数据包(使用 Pcap 文件)。

我的问题是,如果我想在中间停止传输,我会尝试PacketCommunicator.Break(),我可以看到Wireshark它仍然继续发送数据包。我也尝试PacketCommunicator.Dispose()过,在这种情况下我只会崩溃:vshots.exe 已停止工作。

4

1 回答 1

4

PacketCommunicator.Break() 在这里无济于事。这意味着停止捕获,而不是传输。据我所知,没有明确的方法可以从图书馆做你想做的事,所以我只提出解决方法。看看他们是否对您有帮助,如果没有,请联系开发人员并要求提供此功能。

选项 1 - 您可以使用 PacketCommunicator.SendPacket() 在循环中单独发送每个数据包。这会更慢,但允许您通过修改循环的条件在每个数据包之后停止。

选项 2 - 您可以使用 PacketCommunicator.Transmit 发送,但使用较小批次的数据包

改变

while (inputCommunicator.ReceivePacket(out packet) == PacketCommunicatorReceiveResult.Ok)
{
    sendBuffer.Enqueue(packet);
    ++numPackets;
}

变成类似的东西

int packetsInBatch = MAX_PACKETS_IN_BATCH;    
while (inputCommunicator.ReceivePacket(out packet) == PacketCommunicatorReceiveResult.Ok && packetsInBatch > 0)
{
    sendBuffer.Enqueue(packet);
    ++numPackets;
    --packetsInBatch;
}

并将所有内容放在另一个 for 循环中。这将允许您在批处理结束后停止循环,并且在您发出停止信号后在速度和延迟之间进行权衡。

选项 3 - 无情地杀死发送缓冲区。调用 sendBuffer.Dispose() 并处理后果。

[HandleProcessCorruptedStateExceptions]
private static void Transmit(PacketCommunicator outputCommunicator, PacketSendBuffer sendBuffer, bool isSync)
    {
        try
        {
            outputCommunicator.Transmit(sendBuffer, isSync);                
        }
        catch (Exception e)
        {
            Console.WriteLine(e);
        }
    }

您必须处理 AccessViolationException。我通过将 HandleProcessCorruptedStateExceptions 属性添加到我创建的执行传输的新方法来完成此操作(请参阅如何处理 AccessViolationException)。它似乎可以在我的机器上运行,但这确实是最后的解决方案。除了最简单的命令行实用程序,我不会在没有(非常)通过测试的情况下使用它。非托管代码的工作正在进行中,我不知道当我们使用这个技巧时资源会发生什么。

于 2013-08-11T18:38:13.560 回答