【问题标题】:c# - make public an object created inside a functionc# - 公开在函数内创建的对象
【发布时间】:2014-01-23 07:28:15
【问题描述】:

如何在回调函数中使用 main() 中创建的对象“communicator”? PacketCommunicator 类没有构造函数。

class Program
{
    //public static PacketCommunicator communicator = new PacketCommunicator(); - can't do this; PacketCommunicator constructor doesn't exist
    //public static PacketCommunicator communicator = null; - this gives "Object reference not set to an instance of an object"
    public static void Main(string[] args)
    {
        PacketCommunicator communicator = selectedDevice.Open(...)
        communicator.ReceivePackets(0, PacketHandler);
    }

    // Callback function invoked by ReceivePackets for every incoming packet
    private static void PacketHandler(Packet packet)
    {
        communicator.SendPacket(packet);
    }
}

我正在使用的库是Pcap.Net。 基本上,我要做的是在一个接口上捕获数据包,对它们执行 NAT,然后在另一个接口上发送它们。

【问题讨论】:

  • 使用 lambda 表达式和闭包

标签: c# .net pcap winpcap pcap.net


【解决方案1】:

正如 @SLaks 在 cmets 中提到的,您可以使用 lambda。这样通讯器就不会失去作用域。

communicator.ReceivePackets(
    0, (packet) => 
        {
           //processing code goes here...
           communicator.SendPacket(packet);
        });

PCAP 处理接收数据包的方式是将其置于连续循环中,当您遇到想要关闭的时间时中断。

有一个很好的example of that here,虽然他们只是报告数据包,而不是像你看起来那样发送它们。

在此示例中,您将因此实例化通信器

PacketCommunicator communicator = selectedDevice.Open(...)

【讨论】:

  • 我需要回调函数,因为我需要捕获每个数据包,并且在发送它们之前我必须对其进行处理(NAT)。
  • @user1410908 检查我的编辑,您可以轻松地将任何处理或其他方法调用放入您的 lambda。
  • 即使使用 lambda,我仍然在“communicator.SendPacket(packet);”处得到“对象引用未设置为对象实例”在运行时。
  • @user1410908 在 using 语句中吗?如果是的话,把它拿出来。
  • 通信器不能为空,因为接收有效,并且调用了回调函数。
猜你喜欢
  • 2021-07-23
  • 1970-01-01
  • 2022-10-19
  • 1970-01-01
  • 1970-01-01
  • 2017-09-20
  • 1970-01-01
  • 2018-04-05
  • 1970-01-01
相关资源
最近更新 更多