python 怎么获取一个端口或者一个进程的网络流量

 我来答
xiangjuan314
2016-04-10 · TA获得超过3.3万个赞
知道大有可为答主
回答量:2.9万
采纳率:0%
帮助的人:2930万
展开全部
import socket
import struct
import thread
import threading
import time
import os

net_data = {}
d_net_info = {}
lock = threading.Lock()

def print_data():
while True:
lock.acquire()
for key in net_data:
print "%s %s\n"%(key, net_data[key])
lock.release()
time.sleep(5);

def get_net_info():
net_info = os.popen('netstat -nbo').readlines()

for l in net_info[4:]:
s = l.split()
if len(s)>2:
key = "%s %s"%(s[1],s[2])
key2 = "%s %s"%(s[2],s[1])
else:
if not d_net_info.has_key(key):
d_net_info[key] = s[0]
d_net_info[key2] = s[0]

def get_packet():
HOST = socket.gethostbyname(socket.gethostname())
s = socket.socket(socket.AF_INET, socket.SOCK_RAW, socket.IPPROTO_IP)
s.bind((HOST, 0))
s.setsockopt(socket.IPPROTO_IP, socket.IP_HDRINCL, 1)
s.ioctl(socket.SIO_RCVALL, socket.RCVALL_ON)
net_data["unknow"] = 0

while True:
buf = s.recvfrom(65565)
port = struct.unpack('HH', buf[0][20:24])

src_ip = "%d.%d.%d.%d"%struct.unpack('BBBB', buf[0][12:16])
dest_ip ="%d.%d.%d.%d"%struct.unpack('BBBB', buf[0][16:20])
src_port = socket.htons(port[0])
dest_port = socket.htons(port[1])

data_len = len(buf[0])
key="%s:%d %s:%d"%(src_ip,src_port,dest_ip,dest_port)
if not d_net_info.has_key(key):
get_net_info()

if d_net_info.has_key(key):
key2 ="%s %s"%(key,d_net_info[key])
if net_data.has_key(key2):
net_data[key2] =net_data[key2]+data_len
else:
net_data[key2] = data_len
else:
net_data["unknow"] =net_data["unknow"] + data_len

thread.start_new_thread(print_data,())
get_packet()
os.exit()
本回答被网友采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 1条折叠回答
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式