分分钟出结果?python实现高效流量统计(附源码)
2023-12-13 11:42:58
在一个计算机上运行着许多网络应用进程,每个进程能够关联多个网络端口。每个网络端口在任何时刻仅能与一个进程关联,且一旦成功关联即可接收网络数据包。
基于此场景,我们设计了一个简易的网络流量监控系统,具备以下功能接口:
FlowMonitorSystem() - 系统初始化。
assign_port(self, pid: int, port: int) - 将特定端口port分配给进程pid。
release_port(self, port: int) - 解绑指定端口。
若端口已绑定,则解除绑定,保留已接收的数据量,返回True;若未绑定,返回False。
receive_data(self, port: int, data_length: int) - 指定端口接收一定长度的数据包。
若端口未绑定任何进程,则返回0,表示数据丢失。
若端口已绑定进程,则该进程的接收数据量增加data_length,返回增加后的数据量。
top_processes(self, top_limit: int) - 统计接收最多数据的前top_limit个进程,并按以下规则返回进程ID列表。
不统计未接收过数据的进程。
首先按接收数据总量降序排序,若总量相同,按进程ID升序。
若符合条件的进程数少于top_limit,则根据实际数量返回;若无符合条件的,返回空列表。
该系统为计算机网络监控提供了一个基础而有效的工具,可以帮助管理员监测网络流量和进程活动,确保网络稳定运行。
class FlowStatsSystem:
def __init__(self):
# 存储绑定的进程和端口
self.bind_port_dt = {} # {port: pid, ...}
self.stat_packet_map = {} # {pid: 10, ...}
def bind_port(self, pid: int, port: int):
if port in self.bind_port_dt:
return False
else:
self.bind_port_dt[port] = pid
self.stat_packet_map[pid] = self.stat_packet_map.get(pid, 0)
return True
def unbind_port(self, port: int):
if port in self.bind_port_dt:
del self.bind_port_dt[port]
return True
else:
return False
def recv_packet(self, port: int, packet_len: int):
pid = self.bind_port_dt.get(port)
if pid:
self.stat_packet_map[pid] += packet_len # 该进程上累加报文长度
return self.stat_packet_map[pid]
return 0 # 端口没有绑定在pid上,则直接返回0
def stat_packet(self, top_num: int):
# 统计接收过报文的进程
items = {pid: packet_len for pid, packet_len in self.stat_packet_map.items() if packet_len > 0}
sorted_items = sorted(items.items(), key=lambda x: (-x[1], x[0]))
if len(sorted_items) >= top_num:
result = [pid for pid, _ in list(sorted_items)[:top_num]]
else:
result = [pid for pid, _ in sorted_items]
return result
if __name__ == '__main__':
flow = FlowStatsSystem()
print(flow.bind_port(23215, 443))
print(flow.bind_port(23215, 443))
print(flow.bind_port(23215, 3306))
print(flow.bind_port(23216, 3306))
print(flow.bind_port(23216, 80))
print(flow.recv_packet(3306, 100))
print(flow.recv_packet(443, 200))
print(flow.recv_packet(80, 300))
print(flow.unbind_port(443))
print(flow.stat_packet(3))
总结
Python 简易网络流量监控系统提供了基础而有效的网络管理工具。系统初始化后,通过 assign_port 可以将网络端口分配给特定进程,而 release_port 负责解绑端口。receive_data 接口用于记录端口接收数据的量,若端口未绑定则数据丢失。最关键的功能 top_processes 能统计并返回接收最多数据的顶级进程列表。这一系统便于网络管理员监控网络流量,保障网络的稳定性和效率。通过这些接口,管理员能有效追踪网络资源的分配和使用情况,确保网络环境的优化运行。
文章来源:https://blog.csdn.net/liaozp88/article/details/134966048
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!