2011-09-11 30 views
6

Tôi đã làm theo hướng dẫn tại số http://www.codeproject.com/KB/IP/sharppcap.aspx để triển khai trình thám thính gói đơn giản để tự động xác thực cho tôi, tôi đã quản lý để truy cập phần Lọc và phải thực hiện một số điều chỉnh đối với mã hướng dẫn cho đến nay để nó hoạt động, nhưng bây giờ tôi đã bị bóp nghẹt.Không thể chuyển đổi từ SharpPcap.RawCapture thành PacketDotNet.Packet

Lỗi tôi nhận được là;

Các quá tải tốt nhất phù hợp với phương pháp cho 'PacketDotNet.TcpPacket.GetEncapsulated (PacketDotNet.Packet) có một số đối số không hợp lệ

Đối số 1: không thể chuyển đổi từ 'SharpPcap.RawCapture' thành 'PacketDotNet.Packet'

Nhưng tôi chưa thực hiện bất kỳ tham chiếu nào tới PacketDotNet của tôi (mọi thứ cho đến nay đều là SharpPcap).

Toàn bộ mã tôi có cho đến nay được bao gồm, vấn đề nằm trong hàm device_OnPacketArrival().

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using PacketDotNet; 
using SharpPcap; 

namespace ConsoleApplication1 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string ver = SharpPcap.Version.VersionString; 
      Console.WriteLine("SharpPcap {0}, Example1.IfList.cs", ver); 

      // Retrieve the device list 
      CaptureDeviceList devices = CaptureDeviceList.Instance; 

      // If no devices were found print an error 
      if (devices.Count < 1) 
      { 
       Console.WriteLine("No devices were found on this machine"); 
       return; 
      } 

      // Extract a device from the list 
      ICaptureDevice device = devices[0]; 

      // Register our handler function to the 
      // 'packet arrival' event 
      device.OnPacketArrival += 
       new SharpPcap.PacketArrivalEventHandler(device_OnPacketArrival); 

      // Open the device for capturing 
      int readTimeoutMilliseconds = 1000; 
      device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds); 

      // tcpdump filter to capture only TCP/IP packets 
      string filter = "ip and tcp"; 
      device.Filter = filter; 

      Console.WriteLine(); 
      Console.WriteLine("-- The following tcpdump filter will be applied: \"{0}\"", 
       filter); 
      Console.WriteLine("-- Listening on {0}, hit 'Enter' to stop...", 
       device.Description); 

      // Start capturing packets indefinitely 
      device.Capture(); 

      // Close the pcap device 
      // (Note: this line will never be called since 
      // we're capturing indefinitely 
      device.Close(); 
     } 
     private static void device_OnPacketArrival(object sender, CaptureEventArgs e) 
     { 
      var tcp = TcpPacket.GetEncapsulated(e.Packet); 
     } 
    } 
} 

Trả lời

6

Một SharpPcap.RawPacket được sử dụng để giữ các dữ liệu thô chiếm trên adapter mạng nhưng PacketDotNet cần các gói tin được phân tích trước khi GetEncapsulated() phương pháp này sẽ làm việc. Các bước bạn cần sẽ trông giống như:

var packet = PacketDotNet.Packet.ParsePacket(rawPacket.LinkLayerType, rawPacket.Data); 

Sau đó, bạn có thể trích xuất các gói gọn TcpPacket thông qua phương thức GetEncapsulated() bằng cách đi qua nó packet.

Ví dụ 12 trong tải xuống nguồn SharpPcap tại https://sourceforge.net/projects/sharppcap/ cho biết cú pháp và cách các gói có thể được sửa đổi.

Hãy nhớ rằng PacketType.GetEncapsulated() sẽ trả lại tham chiếu đến phần đó của gói để sửa đổi nó sẽ thay đổi gói gốc.

+0

Dường như tôi không có lớp .Parse.Parse, gần nhất với một Parse là TcpPacket.ParsePacket(), nhưng tôi không chắc chắn khi bạn có LinkLayer từ (tham chiếu rawPacket trong trường hợp này là gì , Tôi sẽ mong đợi nó là e.Packet nhưng tôi không chắc chắn 100%) – Clorith

+0

Cập nhật câu trả lời của tôi với tên phương thức chính xác. –

+0

Tham chiếu Ví dụ 12 ngay bây giờ, và chúng chỉ có 1 đối số, nhưng tôi vẫn gặp lỗi; "Không có quá tải cho phương pháp 'ParsePacket' mất 1 đối số", điều này là tất cả rất khó hiểu ngay bây giờ. – Clorith

0

Hoặc, bạn có thể sử dụng Pcap.Net, chỉ có một lớp gói mà bạn có thể phân tích động để nhận bất kỳ thứ gì có thể chứa mà không thực hiện bất kỳ gói nào.

Bạn chỉ cần có được một đối tượng gói và làm (ví dụ):

uint sequenceNumber = packet.Ethernet.IpV4.Tcp.SequenceNumber; 

Không cần phải cast nó hoặc biết những loại gói tin đó là trước, tất cả các phân tích được thực hiện tự động.

0

Là bản cập nhật cho câu trả lời của Chris Morgan (vì tôi thấy mình làm việc này ngày hôm nay), getEncapsulated() hiện đã lỗi thời, thay vào đó bạn nên sử dụng packet.Extract() để trích xuất gói được đóng gói.

Các vấn đề liên quan