首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Ubuntu上使用socket.ntohs(0x0003)协议和python SOCK_RAW?

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

Stack Overflow用户
提问于 2016-10-06 19:10:44
回答 1查看 2.5K关注 0票数 2

当我在Ubuntu上使用OSError作为SOCK_RAW套接字的协议参数时,我从SOCK_RAW获得了一个SOCK_RAW。

代码语言:javascript
复制
  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列出:

代码语言:javascript
复制
...
ggp 3   GGP     # gateway-gateway protocol

我不知道如果配置了协议,为什么会出现此错误。我正在使用sudo运行python,所以我应该没有访问问题。

socket.ntohs(0x0003)替换为另一个协议(如socket.IPPROTO_UDP )可以修复错误,但限制套接字可以处理的通信量。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-10-07 14:54:55

首先,如果要使用原始套接字,则需要sudo或root,但调用socket()是错误的。socket()按主机字节顺序接受参数,但通过调用ntohs(),您可以将3的8位GGP协议值转换为16位值768,这是错误的,因为最大可能的协议值是255

你可以这样做

代码语言:javascript
复制
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, 3)

或者以一种更易读的方式

代码语言:javascript
复制
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname('ggp'))
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39903931

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档