AttributeError:模块'socket'没有属性'AF_PACKET'

时间:2016-07-16 00:57:07

标签: python sockets python-3.x

我正在使用Python构建数据包嗅探程序,但是我已经遇到了速度提升。出于某种原因,我认为套接字没有正确导入,因为我在运行程序时收到以下消息:AttributeError: module 'socket' has no attribute 'AF_PACKET'

我正在使用OS X而Pycharm是我的IDE,如果有帮助,我正在运行最新版本的Python。

无论如何,到目前为止我的完整程序是:

import struct
import textwrap
import socket

def main():
    connection = socket.socket(socket.AF_PACKET, socket.SOCKET_RAW, socket.ntohs(3))

    while True:
        rawData, address = connection.recvfrom(65535)
        reciever_mac, sender_mac, ethernetProtocol, data = ethernet_frame(rawData)
        print('\nEthernet Frame: ')
        print('Destination: {}, Source: {}, Protocol: {}'.format(reciever_mac, sender_mac, ethernetProtocol))

# Unpack ethernet frame
def ethernet_frame(data):
    reciever_mac, sender_mac, protocol = struct.unpack('! 6s 6s H', data[:14])
    return getMacAddress(reciever_mac), getMacAddress(sender_mac), socket.htons(socket), data[14:]

# Convert the Mac address from the jumbled up form from above into human readable format
def getMacAddress(bytesAddress):
    bytesString = map('{:02x}'.format, bytesAddress)
    macAddress = ':'.join(bytesString).upper()
    return macAddress

main()

提前感谢您的帮助!

2 个答案:

答案 0 :(得分:6)

实际上,AF_PACKET在OS X上不起作用,它适用于Linux。

AF_PACKET equivalent under Mac OS X (Darwin)

答案 1 :(得分:0)

我在macOS 10.13.1上使用Python 3.6.3和这个很酷的scapy fork that is compatible with python3遇到了这个问题。

我使用的是该工具的0.22版,并且根据建议in this issue降级到版本0.21修复了此问题!

如果scapy不是一个可行的选择,你也可以按照建议in this post尝试pcap库(虽然这里似乎需要使用python 2)。