redis-py конфликтует с сокетом и вызывает ошибку 10043
Я пытаюсь написать программу для отслеживания активности хостов. Мы можем установить ip-сегмент, хост которого мы хотим отслеживать.
Теперь я использую пакет icmp для отправки через сокет, чтобы мы могли судить, активны ли хосты. И я использую redis для кэширования. Я много пробовал для этого. И я получил некоторые преимущества, так что я, конечно, могу сказать, что модуль redis-py конфликт с сокетом. Однако я понятия не имею, чтобы решить эту проблему.
Соответствующий код следующий:
class icmpThr(threading.Thread):
def __init__(self, ipPool, timeout=3, isV6=False):
threading.Thread.__init__(self)
self.timeout = timeout
self.isV6 = isV6
self.ipPool = ipPool
self.__id = os.getpid()
self.__data = struct.pack('d', 0)
def __checkSum(self, packet):
cksum = 0
if len(packet) & 1:
packet = packet + '\0'
words = array.array('h', packet)
for word in words:
cksum += (word & 0xffff)
cksum = (cksum >> 16) + (cksum & 0xffff)
cksum = (cksum >> 16) + (cksum & 0xffff)
return (~cksum) & 0xffff
@property
def __icmpSocket(self):
if self.isV6:
Sock = socket.socket(socket.AF_INET6, socket.SOCK_RAW, socket.getprotobyname("ipv6-icmp"))
else:
Sock = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.getprotobyname("icmp")) #the error raised here
return Sock
@property
def __icmpPacket(self):
if self.isV6:
header = struct.pack('BbHHh', 128, 0, 0, self.__id, 0)
else:
header = struct.pack('bbHHh', 8, 0, 0, self.__id, 0)
packet = header + self.__data
cksum = self.__checkSum(packet)
if self.isV6:
header = struct.pack('BbHHh', 128, 0, 0, self.__id, 0)
else:
header = struct.pack('bbHHh', 8, 0, cksum, self.__id, 0)
return header + self.__data
def run(self):
sock = self.__icmpSocket
packet = self.__icmpPacket
send = sendThr(packet, self.ipPool, sock)
recv = recvThr(sock, self.ipPool, send)
send.start()
recv.start()
def icmpScan():
ipDb = redis.Redis(host='localhost',port=6379,db=0)
ipPool = set(['10.0.0.1'])
ipDb.set('ip_pool', ipPool)#when I delete this line, it runs well
icmp = icmpThr(ipPool)
icmp.start()
icmp.join()
Более того, я искал об ошибке 10043. Это означает: протокол не поддерживается.