Python原始套接字:协议不支持

11
我是一名有用的助手,可以为您翻译文本。
我正在尝试在Linux下使用Python打开一个原始套接字。
我的简单代码:
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind((HOST, 5454))

我遇到了这个错误:

[ERROR] Protocol not supported

顺便提一下,我在Linux 12.04下使用Python 2.7.3运行代码时使用了root用户。

有人有线索吗?

更新dstromberg 给出的 解决方案 是正确的。如果你想要整个数据包,那么使用他的解决方案。但是,还有另一种组合:

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)

在这种情况下,您将收到一个包含IP和TCP标头的完整TCP数据包。如果您使用dstromberg的解决方案,您还将看到以太网标头。因此,这取决于您希望数据包有多“原始”。

也可以工作。


FYI,当以root身份运行时,我得到了相同的错误。 - pts
尝试使用 AF_UNIX,而不是 AF_INET - Anthony
@Anthony,看起来可以了。不过我又遇到了一个新的错误。让我做一些测试,看看它是否能正常工作。谢谢你的建议~~~ - Jerry Meng
你是否想要接收所有的IP数据包?所有的数据包吗?还是特定IP协议的所有数据包? - Robᵩ
@Robᵩ,所有数据包。我们在另一篇帖子中有对话。这是我绕过TCP部分的方法。如果我能接收到所有的数据包,那么我就可以实现目标:一个套接字发送,一个套接字接收。 - Jerry Meng
您可能收到此错误的原因之一是Windows桌面计算机禁止使用原始TCP数据包。显然,云中的Windows 10可能会允许使用它们... - Josiah Yoder
3个回答

10
尝试使用 socket.AF_PACKET 而不是 socket.AF_INET。

我尝试了,但是出现了“[ERROR] No such device”的错误。这实际上让我感到困惑。 - Jerry Meng
1
@JerryMeng - 你使用的是哪个操作系统?在Ubuntu 12.04上,使用root权限,socket.socket(socket.AF_PACKET, socket.SOCK_RAW) 对我来说是有效的。 - Robᵩ
@JerryMeng 1)你不需要将原始套接字绑定到主机上。这样就可以绕过IP,因此你无法享受其任何功能。2)我没有指定协议,因为你说“所有数据包”。 - Robᵩ
2
@JerryMeng - 你可以将原始套接字绑定到特定的设备和协议上。因此,你可以尝试s.bind(("eth0", 0x0800)) - Robᵩ
@Robᵩ 那就是我在输入的内容...是的,我认为我仍然需要绑定到某个东西。 - Jerry Meng
显示剩余4条评论

0

以 root 用户身份运行,不会出现错误:

#!/usr/local/cpython-3.3/bin/python

import socket as socket_mod

#s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
socket = socket_mod.socket(socket_mod.AF_PACKET, socket_mod.SOCK_RAW, socket_mod.IPPROTO_IP)
#socket.bind(('localhost', 5454))
socket.bind(('lo', 5454))

1
事实上,我已经弄清楚了。第二行是不正确的。5454不会给你任何错误,也不会有任何数据包。使用0x0800是正确的端口。谢谢回答~~ - Jerry Meng
为什么有两个答案?把这个合并到你的第一个答案中不是更清晰吗? - Josiah Yoder

-1

尝试使用socket.AF_UNIX,它可以解决你的问题,祝你好运。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接