Монитор сетевого трафика с pcapy в PythonPython

Программы на Python
Ответить
Anonymous
 Монитор сетевого трафика с pcapy в Python

Сообщение Anonymous »

Я написал простой монитор сетевого трафика, чтобы получить скорость передачи данных в Б/с и/или общий объем передачи данных (в Б). Однако когда я тестирую его, передавая файл по FTP (с помощью Total Commander), я просто не могу заставить его измерять общий объем передачи как размер файла. Он всегда дает гораздо меньший размер, чем фактический.
Я не уверен, что делаю что-то не так.
Я установил фильтр BPF:
Ниже приведен мой исходный код:

Код: Выделить всё

import threading
import sys
import pcapy
import time
import logging as logger

class NetMonitor(threading.Thread):

_timeout = 1

@classmethod
def get_net_interfaces(cls):
return pcapy.findalldevs()

def __init__(self, device, bpf_filter):
threading.Thread.__init__(self)

self.active = True
self._net_monitor = pcapy.open_live(device, 65535, 0, 1000) #self.timeout * 1000)
self._net_monitor.setfilter(bpf_filter)
#self.dumper = self.net_monitor.dump_open("pkt_dump.txt")

self._current_bytes_rate = 0
self.total_transfer = 0 # total number of Bytes transfered

#

self._dispatch_bytes_sum = 0 # sums up packets size for one dispatch call

def __handle_packet(self, header, data):
# method is called for each packet by dispatch call (pcapy)
self._dispatch_bytes_sum += len(data) #header.getlen() #len(data)
#logger.debug("h: ({}, {}, {}), d:{}".format(header.getlen(), header.getcaplen(), header.getts(), len(data)))
#self.dumper.dump(header, data)

def update(self):
self._dispatch_bytes_sum = 0
# process packets
packets_nr = self._net_monitor.dispatch(-1, self.__handle_packet)
self.total_transfer += self._dispatch_bytes_sum

self._inc += 1
self._current_bytes_rate = self._dispatch_bytes_sum  # add single dispatch B/s -> timeout is 1 s
self._tmp_bytes_per_sec_sum += self._current_bytes_rate

logger.debug('inc:{}, current rate: {} B/s, avg rate: {} B/s,  total:{} B'.format(self._inc, self.current_rate, self.avg_rate, self.total_transfer))

return self._current_bytes_rate, packets_nr

def get_avg_bytes_rate(self):
if self._inc:
return self._tmp_bytes_per_sec_sum / self._inc
else:
return 0

def get_current_bytes_rate(self):
return self._current_bytes_rate

def run(self):
while(self.active):
self.update()
time.sleep(self._timeout)

# average B/s rate
avg_rate = property(get_avg_bytes_rate)
# current B/s rate
current_rate = property(get_current_bytes_rate)

if __name__ == '__main__':

filter = ' '.join(sys.argv[2:])
print filter
#nm0 = NetMonitor(pcapy.findalldevs()[0], filter)
nm1 = NetMonitor(pcapy.findalldevs()[1], filter)

nm1.start()
start_time = time.time()
while time.time() - start_time < int(sys.argv[1]):
print "current {} B/s, avg {} B/s, total transfer {} B".format(nm1.current_rate, nm1.avg_rate, nm1.total_transfer)
time.sleep(1)

nm1.active = False
nm1.join()

print "++++++ total: {}, avg: {}".format(nm1.total_transfer, nm1.avg_rate)
Любые советы очень ценны.
С уважением.
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Python»