C#原始套接字ARP应答

C#原始套接字ARP应答,c#,arp,C#,Arp,我是一名学生,试图学习更多关于C语言中的ARP和套接字的知识# 为此,我尝试使用C#中的原始套接字发送ARP请求和回复 我已经在字节数组中手动重建了一个ARP应答,我正在尝试使用Socket.send方法发送它 static void Main(string[] args) { // Create a raw socket var socket = new Socket(AddressFamily.InterNetwork, SocketType.Raw, ProtocolTyp

我是一名学生,试图学习更多关于C语言中的ARP和套接字的知识#

为此,我尝试使用C#中的原始
套接字
发送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地址

如何使用
套接字正确发送ARP回复(/request)


PS:我知道这可能有一个库,但我想在使用库时,我不会对套接字和ARP了解太多。

过了一段时间,我忘记了这个问题,但从中得到了答案

关于这个问题,本文的一部分特别有趣:

对原始套接字的限制

在Windows 7、Windows Vista、带Service Pack 2(SP2)的Windows XP和带Service Pack 3(SP3)的Windows XP上,通过原始套接字发送流量的能力受到以下几种方式的限制:

  • TCP数据不能通过原始套接字发送
  • 无法通过原始套接字发送源地址无效的UDP数据报。网络接口上必须存在任何传出UDP数据报的IP源地址,否则数据报将被丢弃。此更改旨在限制恶意代码创建分布式拒绝服务攻击的能力,并限制发送伪造数据包(具有伪造源IP地址的TCP/IP数据包)的能力
  • 不允许使用IPPROTO_TCP协议的原始套接字调用bind函数
无法通过原始套接字发送源地址无效的UDP数据报。网络接口上必须存在任何传出UDP数据报的IP源地址,否则数据报将被丢弃。此更改旨在限制恶意代码创建分布式拒绝服务攻击的能力,并限制发送伪造数据包(具有伪造源IP地址的TCP/IP数据包)的能力

所以这个问题的简单答案是:用普通的C#.net框架发送这样的数据包是不可能的


对于任何想使用C#发送数据包的人:您可以使用。

您可以尝试发送到目标广播ip(类似于
socket.SendTo(buffer,buffer.Length,SocketFlags.None,new-IPEndPoint(IPAddress.Parse(“192.168.1.255”),0))
,但我不确定它是否能满足您的要求(尽管它应该删除异常)。