2016-10-08 5 views
1

Ich möchte fragen, warum mein Communicator gesendete Frames empfängt. Ich versuche, dieses Problem mit Flag PacketDeviceOpenAttributes.NoCaptureLocal für den Empfang von Communicator zu beheben, aber ich empfange immer noch gesendete Frames. Kann jemand wissen, wie man dieses Problem repariert? Vielen Dank. Hier ist mein Code:C# Pcap.net Kommunikation

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; 

    } 
} } 
+0

Ich habe einen Fehler gemacht. PacketDeviceOpenAttributes.NoCaptureRemote wurde nur versucht. Obwohl ich NoCaptureLocal verwende, funktioniert es immer noch nicht richtig. Bitte, helfen Sie. –

+0

Sie sollten 'break' verwenden, um die for-Schleife zu beenden. * Allerdings *, 'sendDevice = allDevices.FirstOrDefault (d => d.Name.Equals (listDevices.SelectedItems [0] .Text)' wäre ein bisschen sauberer anstelle der ganzen Schleife. Auch, wie Ihre Schleife strukturiert ist, wenn Der Name wird nicht gefunden (aus irgendeinem Grund), dann kommt 'sendDevice' als letztes Element in' allDevices', was Sie wahrscheinlich nicht wollen. –

+0

ja mein Code ist nicht effektiv, aber das wird mein Problem nicht lösen, bin ich richtig? Ich möchte nur gesendete Frames erfassen, das ist alles:/ –

Antwort

1

Sie scheinen verschiedene PacketCommunicators zu verwenden, einen zum Senden und einen zum Empfangen.

Die Dokumentation für NoCaptureRemote besagt "Definiert, ob der lokale Adapter seinen eigenen generierten Datenverkehr erfasst.".

Da Sie zwei verschiedene Kommunikatoren verwenden, erfasst der empfangende Communicator den sendenden Communicator.

+0

Selbst wenn ich einen Communicator verwenden, um das gleiche Paket zu empfangen und zu senden, erhalte ich immer das gesendete Paket. –