2013-11-01 50 views
5

我想在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蟒蛇2.7.3,和我用root运行码。

有没有人有线索?

更新:我的灵魂, 由dstromberg给出的解决方案是正确的。如果你想要所有的数据包,然后使用他的解决方案。 但是,还有另一种组合

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

也有效。

在这种情况下,您将收到所有带有IP和TCP标头的TCP数据包。 如果你使用dstromberg的解决方案,你也会看到以太网头。所以这取决于你希望你的数据包有多“原始”~~

+0

FYI我运行它作为根时得到同样的错误。 – pts

+0

试试'AF_UNIX',而不是'AF_INET'。 – Anthony

+0

@Anthony,它似乎工作。不过,我得到了新的错误。让我做一些测试,看看它是否有效。感谢您的建议~~~ –

回答

6

尝试socket.AF_PACKET而不是socket.AF_INET。

+0

我试过了,我得到了“[错误]没有这样的设备”。实际上,它让我感到困惑。 –

+1

@JerryMeng - 你在运行什么操作系统?在具有root权限的Ubuntu 12.04上,'socket.socket(socket.AF_PACKET,socket.SOCK_RAW)'为我工作。 –

+0

@Robᵩ那么你如何将你的套接字绑定到主机?像s.bind((HOST,5454))?我得到了“[错误]没有这样的设备”。顺便说一下,如果我使用AF_PACKET,为什么我不需要指定原始参数? –

0

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

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是使用的正确端口。感谢您回答~~ –