2016-10-08 12 views
1

なぜ私のコミュニケータは送信フレームを受信して​​いるのですか?コミュニケータを受信するためにフラグPacketDeviceOpenAttributes.NoCaptureLocalを使用してこの問題を解決しようとしていますが、まだ送信フレームを受信して​​います。誰もこの問題を解決する方法を知っていますか?ありがとうございました。私のコードは以下の通りです:C#Pcap.netの通信

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

私は間違いをしました。 PacketDeviceOpenAttributes.NoCaptureRemoteは試しただけでした。私がNoCaptureLocalを使用していても、まだ正常に動作していません。助けてください。 –

+0

forループを終了するには 'break'を使うべきです。 *ただし、*、 'sendDevice = allDevices.FirstOrDefault(d => d.Name.Equals(listDevices.SelectedItems [0] .Text)'は、ループ全体ではなく少し綺麗になります。名前が見つからない(何らかの理由で) 'sendDevice'が最後に' allDevices'の最後の項目になります。 –

+0

私のコードは有効ではありませんが、私の問題は解決しません。 ? –

答えて

1

あなたは送信用と受信用にそれぞれ異なるPacketCommunicatorを使用しているようです。

NoCaptureRemoteのドキュメントでは、「ローカルアダプタが生成されたトラフィックをキャプチャするかどうかを定義します。

2つの異なるコミュニケータを使用しているため、受信コミュニケータは送信コミュニケータを取得します。

+0

私は1つのコミュニケータを使用して同じパケットを送受信しても、常にその送信されたパケットを受信します。 –