As @SLaks mentioned in the comments, you could use a lambda. Then communicator would not lose scope.
communicator.ReceivePackets(
0, (packet) =>
{
//processing code goes here...
communicator.SendPacket(packet);
});
The way that PCAP works with receive packets is to just put it in a continual loop, breaking when you hit a time when you want to close.
There is a nice example of that here, though they are just reporting on the packets, not sending them on as you appear to be.
In this example you would instantiate communicator thusly
PacketCommunicator communicator = selectedDevice.Open(...)