Я пытаюсь использовать функцию sniff()
, которая обеспечивает scapy но он поднимает следующую ошибку:Scapy сопение() функция не работает без видимых причин
Traceback (most recent call last):
File "TestCode.py", line 54, in <module>
packets = getMessege()
File "TestCode.py", line 45, in getMessege
return sniff(count=getLen(), lfilter=filterFrom)
File "C:\Heights\PortableApps\PortablePython2.7.6.1\App\lib\site-packages\scapy\sendrecv.py", line 575, in sniff
sel = select([s],[],[],remain)
select.error: (10038, 'An operation was attempted on something that is not a socket')
Вот код (FromGlobal
является кортежем, что содержит IP-адрес и порт отправителя):
def getLen():
while True:
length, LenFrom = sock.recvfrom(1024)
try:
IntLen = int(length)
except:
pass
else:
if LenFrom == FromGlobal:
return IntLen
def filterFrom(pck):
try:
return pck[IP].src == FromGlobal[0] and pck[UDP].sport == FromGlobal[1]
except:
return False
def getMessege(): # TODO This needs to return only the messege and port
return sniff(count=getLen(), lfilter=filterFrom)
packets = getMessege()
print packets.show()
странная часть что если я пытаюсь это сделать так:
def func1():
return int('1')
def lfilter(pack):
return TCP in pack and pack[IP].src != '8.8.8.8'
def func():
return sniff(count=func1(), lfilter=lfilter)
var = func()
print var.show()
он работает отлично. Если бы кто-то мог указать на разницу между ними, это очень помогло бы.
Я использую WinPcap 4.1.3 и scapy 2.x.
вы можете отделить 'getLen()' часть проблемы? в 'getMessage' do' l = getLen() 'возможно даже печатать' l' и вызывать 'sniff (count = l, lfilter = filterFrom)', потому что вызов вашего кода без getLen() не реплицирует проблему, и мы не можем использовать getLen поскольку он использует существующий сокет. – DorElias