c# - сделать общедоступным объект, созданный внутри функции

Как я могу использовать объект «коммуникатор», созданный в main(), в функции обратного вызова? Класс 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 и отправлять их на другой интерфейс.


person Chris    schedule 05.01.2014    source источник
comment
Используйте лямбда-выражение и замыкание   -  person SLaks    schedule 06.01.2014


Ответы (1)


Как упоминалось в комментариях @SLaks, вы можете использовать лямбду. Тогда коммуникатор не потерял бы возможности.

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

Способ, которым PCAP работает с полученными пакетами, состоит в том, чтобы просто поместить его в непрерывный цикл, прерывающийся, когда вы достигаете времени, когда вы хотите закрыть.

Существует хороший пример этого здесь , хотя они просто сообщают о пакетах, а не отправляют их, как вам кажется.

В этом примере вы должны создать экземпляр коммуникатора таким образом

PacketCommunicator communicator = selectedDevice.Open(...)
person crthompson    schedule 05.01.2014
comment
Мне нужна функция обратного вызова, потому что мне нужно захватить каждый пакет, и я должен обработать их (NAT) перед отправкой. - person Chris; 06.01.2014
comment
@user1410908 user1410908 проверьте мои правки, вы можете легко поместить любую обработку или вызовы других методов в свою лямбду. - person crthompson; 06.01.2014
comment
Даже с лямбдой я все еще получаю ссылку на объект, не установленную на экземпляр объекта в коммуникаторе.SendPacket(packet); во время выполнения. - person Chris; 06.01.2014
comment
@user1410908 user1410908 это в операторе использования? Если это так, выньте его. - person crthompson; 06.01.2014
comment
коммуникатор не может быть нулевым, потому что работает прием и функция обратного вызова, которую он вызывает. - person Chris; 06.01.2014
comment
давайте продолжим это обсуждение в чате - person crthompson; 06.01.2014