python raw socket:不支持协议

Jer*_*eng 7 python sockets linux

我试图在linux下用Python打开一个原始套接字.

我的简单代码:

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind((HOST, 5454))
Run Code Online (Sandbox Code Playgroud)

我收到了这个错误:

[ERROR] Protocol not supported
Run Code Online (Sandbox Code Playgroud)

顺便说一句,我在linux 12.04下使用python 2.7.3,我用root来运行代码.

有人有线索吗?

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

s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
Run Code Online (Sandbox Code Playgroud)

也有效.

在这种情况下,您将收到所有带有IP和TCP标头的TCP数据包.如果您使用dstromberg的解决方案,您还将看到以太网标头.所以它取决于你想要你的数据包的'原始'~~

dst*_*erg 7

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

  • @JerryMeng - 您可以将原始套接字绑定到特定设备和协议。所以,你可以试试`s.bind(("eth0", 0x0800))`。 (2认同)