你如何在Ubuntu上使用socket.ntohs(0x0003)协议和python SOCK_RAW?

时间:2016-10-06 19:10:45

标签: python-3.x ubuntu packet-sniffers raw-sockets

当我使用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可修复错误,但会限制套接字可以处理的流量。

1 个答案:

答案 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'))