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

은 당신이 보내는, 하나를 다른 PacketCommunicators를 사용하는 것 및 수신을위한 하나.

NoCaptureRemote에 대한 설명서에는 "로컬 어댑터가 자체 생성 트래픽을 캡처하는지 정의합니다."라고 명시되어 있습니다.

두 개의 다른 커뮤니케이터를 사용하기 때문에 수신 통신기가 송신 커뮤니케이터를 캡처합니다.

+0

동일한 패킷을 수신하고 전송하기 위해 하나의 커뮤니케이터를 사용하는 경우에도 항상 보낸 패킷을 받는다. –