【发布时间】: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 中实现。
【问题讨论】:
-
你可以用 setsockopt 做到这一点,看到这个答案stackoverflow.com/a/14478657/1182653
-
这能回答你的问题吗? bind socket to network interface
-
使用setsockopt就是绑定到接口上。我能够做到这一点......但无法通过接口发送任何任意数据
标签: python c sockets networking raw-sockets