【发布时间】:2018-09-11 12:33:57
【问题描述】:
我是一名学生,想了解更多关于 C# 中的 ARP 和套接字的信息
为此,我尝试使用 C# 中的原始 Socket 发送 ARP 请求和回复。
我已经在一个字节数组中手动重建了一个 ARP 回复,我正在尝试使用 Socket.Send 方法发送它。
static void Main(string[] args)
{
// Create a raw socket
var socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolType.Raw);
// Setup ARP headers
byte[] buffer = new byte[]
{
0x34, 0x97, 0xf6, 0x22, 0x04, 0xe8, // Ethernet Destination mac
0x70, 0x1c, 0xe7, 0x51, 0x94, 0x0b, // Ethernet source mac
0x08, 0x06, // Type: ARP
00, 0x01, // Hardware type: Ethernet
0x08, 0x00, // Protocol type: IPv4
0x06, // Hardware size: 6
0x04, // Protocol size: 4
00, 0x02, // Opcode: Reply
0x70, 0x1c, 0xe7, 0x51, 0x94, 0x0b, // Sender mac addr
0xc0, 0xa8, 0x01, 0x34, // Sender IP addr 192.168.1.52
0x34, 0x97, 0xf6, 0x22, 0x04, 0xe8, // Target mac addr
0xc0, 0xa8, 0x01, 0x01 // Target ip addr 192.168.1.1
};
// Send ARP reply
socket.Send(buffer, buffer.Length, SocketFlags.None);
Console.ReadKey();
}
当我尝试运行此代码时,应用程序会抛出 SocketException:
由于未连接套接字并且(在使用 sendto 调用在数据报套接字上发送时)未提供地址,因此不允许发送或接收数据的请求
不过,据我了解,我已在请求中提供了目标 MAC 地址。
我应该如何使用Socket 正确发送 ARP 回复(/request)?
PS:我知道这可能有一个库,但我认为在使用库时我不会学到太多关于套接字和 ARP 的知识。
【问题讨论】:
-
您可以尝试发送到目标广播 ip(类似于
socket.SendTo(buffer, buffer.Length, SocketFlags.None, new IPEndPoint(IPAddress.Parse("192.168.1.255"), 0));,但我不确定它会按照您的意愿行事(尽管它应该会删除异常)。