我正在使用PcapDot.Net项目Dll发送数据包(使用Pcap文件)。
我的问题是,如果我想在中间停止传输,我尝试PacketCommunicator.Break()
,我可以看到Wireshark
它仍然继续发送数据包。
我也尝试PacketCommunicator.Dispose()
,在这种情况下我只会崩溃:vshots.exe已停止工作。
答案 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)来完成此操作。它似乎适用于我的机器,但这确实是最后的解决方案。我不会在没有(非常)通过测试的最简单的命令行实用程序中使用它。有非托管代码的工作正在进行,我不知道当我们采用这个技巧时资源会发生什么。