我想编写一个数据包嗅探器来嗅探所有传入的 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 端口接收?
最佳答案
如果您使用 SOCK_STREAM 而不是 SOCK_RAW,您将无法读取协议(protocol) header ,而只能读取通过 TCP 传输的数据。另一方面,SOCK_RAW 将使您能够访问完整的数据包 header 。就您而言,当您想要构建自己的协议(protocol)分析器(嗅探器)时,SOCK_RAW 应该是您的选择。
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/