如何在 Ubuntu 上使用 socket.ntohs(0x0003) 协议与 python SOCK_RAW?
How do you use socket.ntohs(0x0003) protocol with python SOCK_RAW on Ubuntu?
当我使用 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
,修复了错误,但限制了套接字可以处理的流量。
首先,如果您想使用原始套接字,则需要 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'))
当我使用 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
,修复了错误,但限制了套接字可以处理的流量。
首先,如果您想使用原始套接字,则需要 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'))