【问题标题】:Implementing Raw Sockets in C vs Python在 C 与 Python 中实现原始套接字
【发布时间】:2021-02-25 13:34:56
【问题描述】:

我一直在学习如何在 python 中使用原始套接字。

python 中的原始套接字可用于将任意二进制数据发送到任何特定接口,无需任何其他详细信息,例如 MAC 地址或 IP 地址。

例如,考虑以下代码:

import socket
sock = socket.socket(socket.AF_PACKET, socket.SOCK_RAW, socket.htons(3))
sock.bind(('lo',0))
sock.send('This is a sample Raw Socket Code'.encode())
sock.close()

当这个脚本以 root 用户身份执行时,我们可以在 Wireshark(或任何嗅探器)中的环回接口中捕获一个数据包(因为我已将套接字绑定到“lo”),其中包含二进制字符串上面的文字,仅此而已(当然,这是一个格式错误的数据包)。

问题是,我找不到这个用例在 C 中的实现。我能找到的 C 中原始套接字的每个实现都处理某种地址。 sendto() 需要参数 (struct sockaddr*),它是 (struct sockaddr_ll*) 或 (struct sockaddr_in*) 的通用版本,最终需要一个地址。

我们如何在 C 中实现上述用例?我知道我们可以立即使用 python 实现,因为它是可用的。但我很想知道如何在 C 中实现。

【问题讨论】:

标签: python c sockets networking raw-sockets


【解决方案1】:

您可以使用以下代码

int send(int fd, int ifindex, const uint8_t* buf, size_t len) {
    struct sockaddr_ll to;
    struct sockaddr* to_ptr = (sockaddr*)&to;
    to.sll_family = AF_PACKET;
    to.sll_ifindex = ifindex;
    to.sll_halen = 6;
    memcpy(&to.sll_addr, buf, 6);
    int ret = sendto(fd, buf, len, 0, to_ptr, sizeof(to));
    return ret;
}

在哪里

  • fd - 套接字 ID
  • ifindex - 要用于发送的接口的 ifindex
  • buf - 是一个带有已形成以太网帧的缓冲区
  • len - 缓冲区的长度

【讨论】:

    猜你喜欢
    • 2012-01-19
    • 2010-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-10-28
    • 2021-06-11
    • 1970-01-01
    • 2012-03-11
    相关资源
    最近更新 更多