Python中scapy和socket性能优化的问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python中scapy和socket性能优化的问题相关的知识,希望对你有一定的参考价值。

要实现快速扫描出局域网内所有在线的PC,得到他们的IP、Hostname、Mac
功能已经实现:用scapy可以获得IP/Mac,再通过IP用socket的gethostbyaddr取得Hostname,关键就是这里了。

测试单独只用scapy扫描很快,大概5秒左右
但是加是socket会变成15秒钟左右,这个实在不能接受
后来把socket取得Hostname那块写了个多线程还是得9秒左右

大家看看还有没有什么更好的方法?

代码:
from scapy.all import *
import socket
from threading import Thread

class netApp:
"""sniffer local net"""

def __init__(self):
self.HostName = socket.gethostname()
self.HostIP = socket.gethostbyname(self.HostName)

def localHost (self):
localInfo = ["IP","HostName","Mac"]

def localNet (self):
"""get local active machine
return IP/Hostname/Mac"""
HOST = self.HostIP + "/24"

conf.verb=0
ans,unans=srp(Ether(dst="ff:ff:ff:ff:ff:ff")/ARP(pdst=HOST),timeout=2)

collection = []
threadList = []
for snd,rcv in ans:
#tempName = hostnameApp().getHostName(rcv.sprintf(r"%ARP.psrc%"))
tempIP = rcv.sprintf(r"%ARP.psrc%")
tempMac = rcv.sprintf(r"%Ether.src%")

singleThread = newThread(tempIP,tempMac)
threadList.append(singleThread)
singleThread.start()

for singleThread in threadList:
singleThread.join()
if singleThread.result:
collection.append(singleThread.result)

return collection

class newThread(Thread):
def __init__ (self,dst,dmac):
Thread.__init__(self)
self.dst = dst
self.dmac = dmac
self.result = ''

def run(self):
try:
self.result = [self.dst,socket.gethostbyaddr(self.dst)[0],self.dmac]
except socket.herror,e:
return

if __name__=="__main__":
"""my test"""
starttime=time.clock()

t = netApp()
c = t.localNet()

stoptime=time.clock()

print c

print "Running took %.3f seconds" % (stoptime-starttime)

我这实验的结果是一个gethostbyaddr 2秒左右(没用多线程)不知楼主的情况怎么样

另外,如果不是非python不可,可以考虑用nbtscan嘛,python的gethostbyaddr是用c写的lib也就是说再优化也优化不到哪去的了
参考技术A 我想不出还有什么更好解决办法了。期待高手解答。

scapy在Windows上的安装

你需要以下为软件在Windows上安装Scapy:

 

Python:Python 2.7或3.3 +。安装后,将Python安装目录及其脚本子目录添加到您的路径中。根据你的Python版本,默认是C:\ python27和C:\ python27 \脚本分别。

Npcap:最新版本。默认值是推荐。Scapy还将与WinPcap。

Scapy:最新的开发版本的Git仓库。解压缩档案,目录中打开一个命令提示符运行“python setup.py install”。

下载地址:https://github.com/secdev/scapy/archive/master.zip

只需下载文件并运行安装程序。选择默认安装选项应该是安全的。

 

为了方便,直接链接被提供给支持的版本(Python 2.7和3.3 +)。如果这些链接不起作用,或者如果您使用的是不同的Python版本(这肯定不行),只需访问相应包的主页并查找Windows二进制文件即可。作为最后的手段,在Web上搜索文件名。

 

安装后所有的包,打开一个命令提示符(cmd .exe)和运行在于通过键入Scapy。如果你已经正确设置路径,这会在你的C点的批处理文件:\ python27 \脚本目录和指导Python解释器加载Scapy。

 

如果真的似乎没有任何工作,考虑跳过Windows版本和使用Linux Live CD–无论是在您的Windows主机或从光盘启动虚拟机在于:旧版Scapy已经包含在GRML和回溯为例。在使用Live CD可以轻松升级到最新版本的在于打字cd /tmp和wget scapy.net。

以上是关于Python中scapy和socket性能优化的问题的主要内容,如果未能解决你的问题,请参考以下文章

python高性能代码之多线程优化

python高性能代码之多线程优化

Scapy 和 Python 3.2

scapy在Windows上的安装

python scapy的用法之ARP主机扫描和ARP欺骗

python scapy 能拿到请求与响应体吗