2014-01-05 26 views
2

如何在回調函數中使用main()中創建的對象「communicator」? 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

使用lambda表達式和閉合 – SLaks

回答

1

作爲@SLaks在評論中提到,你可以使用lambda。那麼傳播者不會失去範圍。

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

該PCAP可與接收數據包是剛剛把它放在一個連續循環,打破當你打的時候要關閉時間的方式。

有一個不錯的example of that here,雖然他們只報告數據包,不像你看起來那樣發送它們。

在這個例子中,你會實例化溝通正是如此

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

我需要的回調函數,因爲我需要捕捉每一個數據包,我有我之前對它們進行處理(NAT)發送它們。 – Chris

+0

@ user1410908檢查我的編輯,您可以輕鬆地將任何處理或其他方法調用放入您的lambda。 – paqogomez

+0

即使使用lambda,我仍然在「communicator.SendPacket(packet)」中得到「Object reference not set to a instance of a object」在運行時。 – Chris

相關問題