当我使用ntohs(0x0003)
作为Ubuntu上SOCK_RAW套接字的协议参数时,我从Python得到一个OSError。
File "sniffer_all.py", line 44, in main
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.ntohs(0x0003))
File "/usr/lib/python3.5/socket.py", line 134, in __init__
_socket.socket.__init__(self, family, type, proto, fileno)
OSError: [Errno 22] Invalid argument
我检查了/ etc / protocols文件,它列出了3作为GGP:
...
ggp 3 GGP # gateway-gateway protocol
如果配置了协议,我不知道为什么会出现此错误。我正在用sudo运行python,所以我应该没有访问权限。
使用其他协议(例如socket.ntohs(0x0003)
)替换socket.IPPROTO_UDP
可修复错误,但会限制套接字可以处理的流量。
答案 0 :(得分:1)
首先,如果您想使用原始套接字,则需要sudo
或root,但是您错误地调用了socket()
。 socket()
接受主机字节顺序中的参数,但通过调用ntohs()
,您将3
的8位GGP协议值转换为16位值768
这是错误的,因为最大可能的协议值是255
。
你可以这样做
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, 3)
或以更易读的方式
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname('ggp'))