c# - BeginReceiveFrom 不会从/到其他设备捕获包
问题描述
我正在尝试在 C# 中进行包嗅探器,并且我想自己编写它,仅使用 C# 方法不依赖于其他作者。我正在使用 BeginReceiveFrom 方法,并且只捕获到 LAN (192.168.0.87) 中的设备和两个地址的包:224.0.0.251:5353、255.255.255.255:57621。当然,在局域网的设备上,我打开了网站以确保有包通过网络。我做错了什么?:-) 每一个帮助表示赞赏!
- 我更改了防火墙规则以不阻止我的应用程序。
- 我向我的应用授予管理员权限。
- 我将方法从 BeginRecive 更改为 BeginReciveFrom。
静态无效嗅探(IPAddress ip){
Socket sck = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.IP);
sck.Bind(new IPEndPoint(ip, 0));
sck.SetSocketOption(SocketOptionLevel.IP, SocketOptionName.HeaderIncluded, true);
sck.IOControl(IOControlCode.ReceiveAll, new byte[4] { 1, 0, 0, 0 }, null);
byte[] buffer = new byte[24];
Action<IAsyncResult> OnReceive = null;
EndPoint endPoint = new IPEndPoint(IPAddress.Parse("192.168.0.87"), 0);
OnReceive = (ar) =>
{
String sourceIp = SourceIP(buffer);
String destinationIp = DestinationIp(buffer);
if (sourceIp != ip.ToString() && destinationIp != ip.ToString())
{
Console.WriteLine(
"{0}\t{1}:{2}\t===>\t{3}:{4}"
, buffer.Skip(9).First().ToProtocolString()
, SourceIP(buffer)
, ((ushort)IPAddress.NetworkToHostOrder(BitConverter.ToInt16(buffer, 20))).ToString()
, DestinationIp(buffer)
, ((ushort)IPAddress.NetworkToHostOrder(BitConverter.ToInt16(buffer, 22))).ToString());
}
buffer = new byte[24]; //clean out our buffer
//sck.BeginReceive(buffer, 0, 24, SocketFlags.None, new AsyncCallback(OnReceive), null);
sck.BeginReceiveFrom(buffer, 0, 24, SocketFlags.None, ref endPoint, new AsyncCallback(OnReceive), null);
};
// sck.BeginReceive(buffer, 0, buffer.Length, SocketFlags.None, new AsyncCallback(OnReceive), null);
sck.BeginReceiveFrom(buffer, 0, buffer.Length, SocketFlags.None, ref endPoint, new AsyncCallback(OnReceive), null);
}
private static String SourceIP(byte[] buffer)
{
return new IPAddress(BitConverter.ToUInt32(buffer, 12)).ToString();
}
private static String DestinationIp(byte[] buffer)
{
return new IPAddress(BitConverter.ToUInt32(buffer, 16)).ToString();
}
public static string ToProtocolString(this byte b)
{
switch (b)
{
case 1: return "ICMP";
case 6: return "TCP";
case 17: return "UDP";
default: return "#" + b.ToString();
}
}
我只看到来自/到地址 224.0.0.251:5353、255.255.255.255:57621 的几个包。我希望看到 LAN 中设备之间的整个通信。
解决方案
推荐阅读
- design-patterns - 如何从现有的写入数据库生成 CQRS 中的读取数据?
- javascript - 如何在 react-data-grid 中的行选择中禁用行的复选框
- android - Android Kotlin 应用程序未根据接收到的蓝牙数据显示或隐藏图像
- python - DataTable(JQuery):如何用浏览器语言切换语言?
- java - 玩家控制的 JPanel 对象卡在 JFrame 的某些角落
- python - 我怎么能把输入保存为一个整数然后通过一个函数运行它
- reactjs - 在 React Typescript 中配置更漂亮的空格
- python - python抛物线拍摄动画与matplotlib
- python - 如何在模板中获取 Flask 蓝图的名称?
- php - 在 php 类中动态创建“受保护的静态”变量