当我在Ubuntu上使用OSError作为SOCK_RAW套接字的协议参数时,我从SOCK_RAW获得了一个SOCK_RAW。
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/protocol文件,它将3作为GGP列出:
...
ggp 3 GGP # gateway-gateway protocol我不知道如果配置了协议,为什么会出现此错误。我正在使用sudo运行python,所以我应该没有访问问题。
将socket.ntohs(0x0003)替换为另一个协议(如socket.IPPROTO_UDP )可以修复错误,但限制套接字可以处理的通信量。
发布于 2016-10-07 14:54:55
首先,如果要使用原始套接字,则需要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'))https://stackoverflow.com/questions/39903931
复制相似问题