Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/329.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 如何停止SeNeBuffic在中间(PCAPdo.NET项目)?_C#_Pcap.net - Fatal编程技术网

C# 如何停止SeNeBuffic在中间(PCAPdo.NET项目)?

C# 如何停止SeNeBuffic在中间(PCAPdo.NET项目)?,c#,pcap.net,C#,Pcap.net,我正在使用PcapDot.Net项目DLL发送数据包(使用Pcap文件) 我的问题是,如果我想在中间停止发送,我尝试 PATETCISCONTUCT.SUBER(,我可以用 WiRESHARK < /代码>看到它仍然继续发送数据包。 我还尝试了PacketCommunicator.Dispose(),在这种情况下,我只得到一个崩溃:vshots.exe已停止工作。PacketCommunicator.Break()在这里没有帮助。这是为了阻止捕获,而不是传输。据我所知,没有明确的方法可以从图书馆

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

我的问题是,如果我想在中间停止发送,我尝试<代码> PATETCISCONTUCT.SUBER(<)/代码>,我可以用<代码> WiRESHARK < /代码>看到它仍然继续发送数据包。 我还尝试了
PacketCommunicator.Dispose()
,在这种情况下,我只得到一个崩溃:vshots.exe已停止工作。

PacketCommunicator.Break()在这里没有帮助。这是为了阻止捕获,而不是传输。据我所知,没有明确的方法可以从图书馆中实现您的愿望,因此我只提出解决办法。看看他们是否帮助你,如果没有-联系开发人员,并要求此功能

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

选项2-您可以使用PacketCommunicator发送数据包。使用较小批量的数据包进行传输

改变

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属性添加到我创建的执行传输的新方法中(请参阅)。它似乎在我的机器上工作,但这确实是最后的解决方案。除了最简单的命令行实用程序之外,我不会在没有(非常)完整测试的情况下使用它。非托管代码的工作正在进行,我不知道当我们使用这个技巧时资源会发生什么情况。

PacketCommunicator.Break()在这里没有帮助。这是为了阻止捕获,而不是传输。据我所知,没有明确的方法可以从图书馆中实现您的愿望,因此我只提出解决办法。看看他们是否帮助你,如果没有-联系开发人员,并要求此功能

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

选项2-您可以使用PacketCommunicator发送数据包。使用较小批量的数据包进行传输

改变

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属性添加到我创建的执行传输的新方法中(请参阅)。它似乎在我的机器上工作,但这确实是最后的解决方案。除了最简单的命令行实用程序之外,我不会在没有(非常)完整测试的情况下使用它。有一些非托管代码正在进行中,我不知道当我们使用这个技巧时资源会发生什么。

你想在一个数据包中间停下来吗?在播放的中间,我有停止按钮,如果这个按钮将执行,我想立即停止播放,而不是等到捕获完成,你会询问传输。你说的是什么捕获?捕获是发送的pCAP文件,你能张贴一些相关的代码吗?你想停在一个包的中间吗?在游戏的中间,我有停止按钮,如果这个按钮将执行,我想立即停止播放,不要等到捕获完成。你问的是传输,你说的是什么捕获?捕获是传输的Pcap文件。你能发布一些相关代码吗?我想使用SendPacket()将是最好的选择,但我发现唯一有问题的是,使用SendPacket()在数据包之间传输所有数据包没有延迟。与尊重数据包时间戳的SendBuffer()相比,我不想使用Thread。Sleep,什么是最好的选择?我不确定Thread。Sleep足够好,但这取决于您的场景——数据包的数量和它们之间的延迟。我不知道对你来说,在你想停止发送后立即停止发送有多重要。我认为第二种选择总体来说是最好的。您可以创建一个一两秒钟的缓冲区,发送它,同时准备下一个,以尽量减少延迟。为了完整性,我只添加了第三个选项,我不会用棍子碰它。为什么第三个选项是个坏主意?因为存在非托管代码。我不知道什么会在谋杀案发生后继续运行,或者什么资源不会被正确释放等等。正如我所说,我认为这是最后一种方法,你应该谨慎使用。非常感谢你的帮助。我认为使用SendPacket()将是最好的选择,但我发现唯一有问题的是,使用SendPacket()在数据包之间传输所有数据包,与尊重数据包时间戳的SendBuffer()相比,没有延迟,我不想使用Thread.Sleep,最好的选择是什么?我不确定Thread.Sleep是否足够好,但这取决于您的场景—数据包的数量和它们之间的延迟。我不知道对你来说,在你想停止发送后立即停止发送有多重要。我认为第二种选择总体来说是最好的。您可以创建一个一两秒钟的缓冲区,发送它,同时准备下一个,以尽量减少延迟。为了完整性,我只添加了第三个选项,我不会用棍子碰它。为什么第三个选项是个坏主意?因为存在非托管代码。我不知道什么会在谋杀案后继续运行,或者什么资源不会被释放