如何在中间停止SendBuffer(PcapDot.Net项目)?

时间:2013-08-11 10:48:37

标签: c# pcap.net

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

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

1 个答案:

答案 0 :(得分: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属性添加到我创建的执行传输的新方法(参见How to handle AccessViolationException)来完成此操作。它似乎适用于我的机器,但这确实是最后的解决方案。我不会在没有(非常)通过测试的最简单的命令行实用程序中使用它。有非托管代码的工作正在进行,我不知道当我们采用这个技巧时资源会发生什么。