Python原始套接字接收问题

标签 python python-2.7 sockets raw-sockets

我正在使用以下 python 脚本进行原始套接字数据包传输。数据包传输正常,但我无法打印来自另一端的传入数据包。

from socket import socket, AF_PACKET, SOCK_RAW

s = socket(AF_PACKET, SOCK_RAW)
s.bind(("eth0", 0))
src_addr = "\x54\xbe\xf7\x40\xf5\x82"
dst_addr = "\xff\xff\xff\xff\xff\xff"

payload = ("[("*30)+"Hello"+("]"*30)
checksum = "\x1a\x2b\x3c\x4d"

data = payload+checksum

s.send(dst_addr+src_addr+data)

#for receive function 

response=s.recv(4096)
print response
s.close()

最佳答案

socket 还有第三个参数功能:protocol 。如果未给出,则默认为 0。对于 AF_PACKET / SOCK_RAWprotocol参数指定您有兴趣接收哪种类型的数据包。这些值记录在 packet(7) 中手册页:http://man7.org/linux/man-pages/man7/packet.7.html

我认为这些值实际上并没有在核心 python2 模块中的任何地方定义。其中一些可以在 scapy ( http://www.secdev.org/projects/scapy/ ) 中找到,或者您可以直接查找定义它们的 Linux 头文件 ( /usr/include/linux/if_ether.h )。

因此,要解决此问题,请将代码更改为:

from socket import socket, AF_PACKET, SOCK_RAW, htons

ETH_P_ALL = 3
ETH_P_IP = 0x800   # Alternatively using this will receive the next IP packet
s = socket(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL))
...

对您的代码的其他评论:

正如所写,您发送的数据包不太可能被任何人理解。您已经有了 dst 和 src MAC 地址,但您没有提供 EtherType。相反,第一个“[(”将被视为 EtherType。这可能对数据包的任何接收者都没有意义,因此它将被丢弃。

此外,您应该了解,使用原始套接字,您将收到协议(protocol)中指定类型的下一个数据包。这不一定(事实上可能不会)是对您刚刚发送的数据包的响应。

关于Python原始套接字接收问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46223017/

相关文章:

python - 在正则表达式匹配后获取部分数据以替换原始字符串

c++ - HTTP 400 错误请求

c# - TcpListener 常量错误 每个地址只使用一次

python - Bash:按字节区分大小写的排序命令或使用 python 排序命令对文本文件进行排序

python - Python 中是否存在 isinstance(value, object) 不为 True 的值?

python从列表中追加元素到列表

python-2.7 - 在 Ubuntu 12.04 中使用 Python2.7 Crontab 设置背景

excel - 我可以禁用 openpyxl 自动将字符串解析为日期时间吗?

node.js - Socket.io 中的身份验证

python - 连接 "database"不存在 Django、CentOS7、NGINX、UWSGI