- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
您好,我正在尝试将 SharpPcap 新版本 SharpPcap-2.2.0rc1.src 中示例 3 中的数据包捕获从控制台应用程序转换为 Windows 窗体应用程序。
当我尝试将已捕获的数据包添加到 ListView 控件时,我遇到了一个问题,我将收到一个错误:
(Cross-thread operation not valid: Control 'listViewPackets' accessed from a thread other than the thread it was created on.)
在这一行:
listViewPackets.Items.Add(e.Packet.ToString());
有什么解决这个问题的建议吗???
这是我的代码:
using SharpPcap;
namespace Packets
{
public partial class Form1 : Form
{
public Form1()
{
InitializeComponent();
}
// Retrieve the device list
private void btnLiDevicest_Click(object sender, EventArgs e)
{
var devices = LivePcapDeviceList.Instance;
// If no devices were found print an error
if (devices.Count < 1)
{
MessageBox.Show("No devices were found on this machine");
return;
}
int i = 0;
// Print out the devices
foreach (LivePcapDevice dev in devices)
{
///* Description */
//Console.WriteLine("{0}) {1} {2}", i, dev.Name, dev.Description);
cmbListDevice.Items.Add(dev.Name + " " + dev.Description);
i++;
}
LivePcapDevice device = devices[1];
// Register our handler function to the 'packet arrival' event
device.OnPacketArrival += new PacketArrivalEventHandler(device_OnPacketArrival);
// Open the device for capturing
int readTimeoutMilliseconds = 1000;
device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);
device.StartCapture();
}
//Console.WriteLine();
//Console.WriteLine("-- Listening on {0}, hit 'Enter' to stop...",
// device.Description);
/// <summary>
/// Prints the time and length of each received packet
/// </summary>
///
protected void device_OnPacketArrival(object sender, CaptureEventArgs e)
{
DateTime time = e.Packet.PcapHeader.Date;
uint len = e.Packet.PcapHeader.PacketLength;
//Console.WriteLine("{0}:{1}:{2},{3} Len={4}",
// time.Hour, time.Minute, time.Second, time.Millisecond, len);
// Console.WriteLine(e.Packet.ToString());
listViewPackets.Items.Add(e.Packet.ToString());
}
}
}
.....................................................................这是原始代码:
using System;
using System.Collections.Generic;
using SharpPcap;
namespace SharpPcap.Test.Example3
{
/// <summary>
/// Basic capture example
/// </summary>
public class BasicCap
{
public static void Main(string[] args)
{
// Print SharpPcap version
string ver = SharpPcap.Version.VersionString;
Console.WriteLine("SharpPcap {0}, Example3.BasicCap.cs", ver);
// Retrieve the device list
var devices = LivePcapDeviceList.Instance;
// If no devices were found print an error
if(devices.Count < 1)
{
Console.WriteLine("No devices were found on this machine");
return;
}
Console.WriteLine();
Console.WriteLine("The following devices are available on this machine:");
Console.WriteLine("----------------------------------------------------");
Console.WriteLine();
int i = 0;
// Print out the devices
foreach(LivePcapDevice dev in devices)
{
/* Description */
Console.WriteLine("{0}) {1} {2}", i, dev.Name, dev.Description);
i++;
}
Console.WriteLine();
Console.Write("-- Please choose a device to capture: ");
i = int.Parse( Console.ReadLine() );
LivePcapDevice device = devices[i];
// Register our handler function to the 'packet arrival' event
device.OnPacketArrival +=
new PacketArrivalEventHandler( device_OnPacketArrival );
// Open the device for capturing
int readTimeoutMilliseconds = 1000;
device.Open(DeviceMode.Promiscuous, readTimeoutMilliseconds);
Console.WriteLine();
Console.WriteLine("-- Listening on {0}, hit 'Enter' to stop...",
device.Description);
// Start the capturing process
device.StartCapture();
// Wait for 'Enter' from the user.
Console.ReadLine();
// Stop the capturing process
device.StopCapture();
Console.WriteLine("-- Capture stopped.");
// Print out the device statistics
Console.WriteLine(device.Statistics().ToString());
// Close the pcap device
device.Close();
}
/// <summary>
/// Prints the time and length of each received packet
/// </summary>
private static void device_OnPacketArrival(object sender, CaptureEventArgs e)
{
DateTime time = e.Packet.PcapHeader.Date;
uint len = e.Packet.PcapHeader.PacketLength;
Console.WriteLine("{0}:{1}:{2},{3} Len={4}",
time.Hour, time.Minute, time.Second, time.Millisecond, len);
Console.WriteLine(e.Packet.ToString());
}
}
}
最佳答案
从另一个线程调用控件时:
if (listView1.InvokeRequired)
{
listView1.BeginInvoke(new MethodInvoker(
() => /*whatever you want with listview */));
}
else
{
/* whatever you want with listview */
}
如果您确定它总是在另一个线程上,那么只需忘记 if/else 并使用调用。
编辑:
所以在你的情况下,它看起来像:
if(listView1.InvokeRequired)
{
listView1.BeginInvoke(new MethodInvoker(
() => listViewPackets.Items.Add(e.Packet.ToString()) ));
}
else
{
listViewPackets.Items.Add(e.Packet.ToString());
}
(再次,或者只是 BeginInvoke 调用,如果它总是在不同的线程上运行)
编辑 2您会注意到 Shane 使用 Invoke 而我使用 BeginInvoke。我把它当作一种习惯的力量。使用 Invoke 将阻塞 UI 线程,如果您执行的操作需要更长的时间,则使用 BeginInvoke 会异步执行对 UI 的更新。
关于C# SharpPcap 跨线程操作无效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2247427/
我正在使用 SharpPcap 来捕获数据包。 我正在尝试获取 Traffic Class 值,并且我正在使用 udp.ipv6.TrafficClass.ToString()。 我遇到此异常的问题:
您好,我正在尝试将 SharpPcap 新版本 SharpPcap-2.2.0rc1.src 中示例 3 中的数据包捕获从控制台应用程序转换为 Windows 窗体应用程序。 当我尝试将已捕获的数据包
这是我第一次使用 SharpPcap 库。 我使用 VC# 2008 创建了新项目,并添加了 SharpPcap 作为对我项目的引用。我发布了一个示例代码来获取我的电脑的界面,但我收到了这个错误: 错
我一直对使用 SharpPcap 很感兴趣,但到目前为止进展并不顺利。 主要问题出在以下代码: private static void device_OnPacketArrival(object
我正在使用 SharpPCap 过滤数据包。有谁知道如何检测数据包是否用于安全的 http 连接? 最佳答案 您必须从 TCP session 开始时嗅探流量,以观察 SSL 握手的来回。一旦建立了加
我只想监听网络设备,捕获数据包并将数据包写入虚拟文件。我还需要在收听时过滤数据包,所以我只写通过过滤器的数据包。我需要在 .net c# 上执行这些操作。这些是我的要求。那么我应该使用哪一个?高传输率
对任何人对可用于被动数据包捕获的各种 .net 工具的任何评论感兴趣。就winpcap 而言,选择似乎是在pcap.net 和sharpcap 之间。另一个潜在的产品是微软的 NetworkMonit
我正在使用 WinPCapDevice 并且已经对其进行了初始化。我只想能够从该设备获取 IP,但我无法在任何地方找到如何提取设备的 IP 地址。如果没有办法做到这一点,那么是否有另一种方法来获取 W
SharpPcap 是一个很棒的库。我正在使用它为 Linux 构建 http 数据包查看器,它工作正常!然而,是否有可能捕获和解密 ssl 流量?一方面,这正是 ssl 的设计目标,所以我会说答案是
我的报告需要小型嗅探器,所以我选择了 C# 和 SharpPcap。 packet = Packet.ParsePacket(rawCapture.LinkLayerType, rawCapture.
我一直在关注 http://www.codeproject.com/KB/IP/sharppcap.aspx 上的指南为了实现一个简单的数据包嗅探器来为我自动进行身份验证,我设法进入了过滤部分,并且到
我将使用 SharpPcap 框架来制作我的欺骗程序,所以我需要在源地址字段中用另一个 IP 地址编辑我机器的数据包 IP 地址。 我在 SharpPcap 项目上找到了一些示例,但是如何编辑或更改发
出于测试原因,我尝试生成一个具有不同源 IP 地址的 http 数据包并将其发布到目的地。 我将使用 sharppcap 或 packetdotnet。 在这里找到好的样本: http://www.t
所以,我花了一个下午尝试使用 SharpPcap 和 Packet.Net 在 c# 中发送 LLDP 数据包。 我想出的是带有 NullReferenceException 的炸弹。我知道为什么,但
到目前为止,我尝试使用 SharpPcap 发送我通过 Packet.Net 创建的 ARP 数据包,但没有成功。问题是即使我使用 device.SendPacket 发送数据包,它实际上并没有被发送
我正在尝试在 FreeBSD 9.2 上读取使用 TShark 1.10.6 和 libpcap 版本 1.4.0 创建的 pcap 文件,并在 Windows 7 上使用 Visual Studio
我是一名优秀的程序员,十分优秀!