Связь C # Pcap.net

Я хотел бы спросить, почему мой коммуникатор принимает отправленные кадры. Я пытаюсь исправить эту проблему, используя флаг PacketDeviceOpenAttributes.NoCaptureLocal для приема коммуникатора, но я все равно получаю отправленные кадры. Может ли кто-нибудь знать, как исправить эту проблему? Спасибо. Вот мой код:

using PcapDotNet.Core;
using PcapDotNet.Packets;
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;

namespace PSIP
{
    public partial class Form2 : Form
    {
    private Packet packet;
    private List<Packet> buffer;
    private IList<LivePacketDevice> allDevices;
    private LivePacketDevice selectedDevice, sendDevice;
    private int pkt_cnt;
    private Thread thrReceive,thrSend;
    public Form2(LivePacketDevice device)
    {
        InitializeComponent();
        Show();
        selectedDevice = device;
        pkt_cnt = 0;
        buffer = new List<Packet>();
        allDevices = LivePacketDevice.AllLocalMachine;

        for (int i = 0; i != allDevices.Count; ++i)
        {
            LivePacketDevice tempDevice = allDevices[i];
            if (device.Description != null)
            {
                ListViewItem row = new ListViewItem(tempDevice.Name);
                listDevices.Items.Add(row);
            }
        }
    }

    private void PacketHandler(object obj)
    {
        throw new NotImplementedException();
    }

    private void PacketHandler(Packet packet)
    {
        ListViewItem itemPacket = new ListViewItem(pkt_cnt.ToString());
        itemPacket.SubItems.Add(packet.Ethernet.Destination.ToString());
        itemPacket.SubItems.Add(packet.Ethernet.Source.ToString());

        pktView.Items.Add(itemPacket);
        buffer.Add(packet);
        pkt_cnt++;
    }

    private void Sending()
    {
        for (int i = 0; i <= allDevices.Count; ++i)
        {
            sendDevice = allDevices[i];
            if (sendDevice.Name.Equals(listDevices.SelectedItems[0].Text))
            {
                i = allDevices.Count;
            }
        }
        using (PacketCommunicator communicator = sendDevice
        .Open(100, PacketDeviceOpenAttributes.Promiscuous | PacketDeviceOpenAttributes.NoCaptureLocal, 1000))
        {
            int index = Int32.Parse(pktView.SelectedItems[0].Text);
            Packet tmpPacket = buffer.ElementAt(index);
            communicator.SendPacket(tmpPacket);
        }
    }

    private void Receiving()
    {
        int c = int.Parse(packetcount.Text);

        using (PacketCommunicator communicator = selectedDevice.Open(65536,
         PacketDeviceOpenAttributes.NoCaptureRemote | PacketDeviceOpenAttributes.Promiscuous, 1000))
        {
            communicator.ReceivePackets(c, PacketHandler);
        }
    }
    private void button1_Click(object sender, EventArgs e)
    {
        thrReceive = new Thread(Receiving);
        thrReceive.Start();
    }

    private void buttonSend_Click(object sender, EventArgs e)
    {
        thrSend = new Thread(Sending);
        thrSend.Start();

    }

    private void pktView_SelectedIndexChanged(object sender, EventArgs e)
    {
        try
        {
            int index = Int32.Parse(pktView.SelectedItems[0].Text);
            Packet tmpPacket = buffer.ElementAt(index);
            textPacket.ResetText();
            textPacket.AppendText(tmpPacket.Ethernet.ToHexadecimalString());
        }
        catch (Exception E)
        {
            Console.WriteLine(E.ToString());
        }
    }

    private void buttonClear_Click(object sender, EventArgs e)
    {
        pktView.Items.Clear();
        buffer.Clear();
        pkt_cnt = 0;

    }
} }

c#,pcap,pcap.net,communicator,

1

Ответов: 1


1

Кажется, вы используете разные PacketCommunicators, один для отправки и один для получения.

Документация для NoCaptureRemoteсостояний «Определяет, будет ли локальный адаптер захватывать свой собственный генерируемый трафик».

Поскольку вы используете два разных коммуникатора, принимающий коммуникатор захватывает передающий коммуникатор.

C #, PCAP, pcap.net, коммуникатор,