10

我正在尝试在 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的解决方案,您还将看到以太网标头。所以这取决于你希望你的数据包有多“原始”。

4

3 回答 3

10

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

于 2013-11-01T17:45:06.900 回答
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))
于 2013-11-01T19:21:04.933 回答
-1

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

于 2013-11-01T18:04:24.053 回答