1

我想问一下为什么我的通讯器接收到发送的帧。我正在尝试使用标志 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;

    }
} }
4

1 回答 1

1

您似乎正在使用不同的 PacketCommunicators,一个用于发送,一个用于接收。

状态文档NoCaptureRemote“定义本地适配器是否将捕获其自己生成的流量。”。

由于您使用了两个不同的通信器,因此接收通信器捕获了发送通信器。

于 2016-10-15T09:56:40.767 回答