python - python3 中的原始套接字

标签 python python-3.x network-programming

我想编写一个数据包嗅探器来嗅探所有传入的 TCP 数据包。在我正在寻找的示例之一中,而不是使用 SOCK_RAW 而不是 SOCK_STREAM?

try:
    s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_TCP)
except socket.error as e:
    print('Socket creation failed. Error Code {} Message {}'.format(str(e[0]),str(e[1])))
    sys.exit()

#Include IP headers
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
packet = s.recvfrom(65565)

1) 在上述情况下我可以使用 SOCK_STREAM 代替 SOCK_RAW 吗? 2)recvfrom(65565)是什么意思? 这是否意味着从所有 TCP 端口而不是特定 TCP 端口接收?

最佳答案

  1. 如果您使用 SOCK_STREAM 而不是 SOCK_RAW,您将无法读取协议(protocol) header ,而只能读取通过 TCP 传输的数据。另一方面,SOCK_RAW 将使您能够访问完整的数据包 header 。就您而言,当您想要构建自己的协议(protocol)分析器(嗅探器)时,SOCK_RAW 应该是您的选择。

  2. recvfrom 的方法定义是:

    socket.recvfrom(bufsize[, flags])

    Receive data from the socket. The return value is a pair (string, address) where string is a string representing the data received and address is the address of the socket sending the data

此方法只是从套接字接收最大 bufsize 字节。

关于python - python3 中的原始套接字,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22801265/

相关文章:

python - Openshift:OSError Errno 98 无法更新服务器

Python - 根据前者的键值将字典的键作为另一个字典的键值附加

java - 用 Java/C++ 处理 Linux 网络连接?

linux-kernel - 内核 qdiscs 模块中的网络数据包缓冲

java - 当套接字被接受时,我怎样才能关闭这个对话框?

python - 在 Python 3.x 中对二维数组求和

python - pandas "stacked"条形图,其中未添加值以给出高度

python - 如何在discord.py重写上获取用户角色

python - 如何在 TensorFlow 中生成随机向量并维护它以供进一步使用?

python - 找到 map 中每个像素的最近邻居