2014-01-05 5 views
2

Как использовать объект «коммуникатор», созданный в функции main(), в функции обратного вызова? Класс PacketCommunicator не имеет конструктора.C# - создать общедоступный объект, созданный внутри функции

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 на них и отправить их на другой интерфейс.

+2

Использование лямбда-выражения и закрытия – SLaks

ответ

1

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

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

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

Есть хороший example of that here, хотя они просто сообщают о пакетах, а не отправляют их, как кажется.

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

PacketCommunicator communicator = selectedDevice.Open(...) 
+0

мне нужно функцию обратного вызова, потому что мне нужно, чтобы захватить каждый пакет, и я должен их обработать (NAT), прежде чем я Отправить их. – Chris

+0

@ user1410908 проверить мои изменения, вы можете легко поместить любую обработку или другие вызовы методов в свою лямбду. – paqogomez

+0

Даже с лямбдой я все еще получаю «Ссылка на объект, не установленную на экземпляр объекта», на «коммуникатор.SendPacket (пакет)»; во время выполнения. – Chris