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