开始程序是单线程的,跑255个主机,我晕,好像要10~20分钟吧,真坑爹~~
后来改为了多线程的了,几秒钟就可以出结果哦~~
程序主要有三个功能:
1.扫描局域网中的所有主机,需要指定起始IP;
2.得到知道主机名的IP地址;
3.得到指定IP地址的主机名。
代码如下: #! /usr/bin/python # coding=gbk ''' 中文编码 功能:局域网内的IP和主机名。 多线程编程。实践表明,多线程比单线程要快好多好多~~ '''
import sys, os, socket, string import threading
list_of_name=[] list_of_ip=[] #存放结果 thread_pool=[]
def showInfo(): print """ 命令格式:LAN_ip_hostname -all startip LAN_ip_hostname -ip ipaddr LAN_ip_hostname -hostname hostname 说明:-all 扫描局域网中所有IP对应的hostname,需要起始IP,如192.168.0.1 -ip 获取指定IP的hostname -hostname 根据主机名,得到其IP地址 """
def lanAll(startip): index=string.rfind(startip,'.') #找最右边的.的索引 ipfirstpart=startip[0:index+1] intstart=string.atoi(startip[index+1 :]) #点分十进制的最后的串转为int型
f=range(intstart,255)
global g_mutex #互斥量。不能定义称全局变量,否则,目标函数不认同 g_mutex=threading.Lock() #初始化互斥量 for iplastpart in f: targetip=ipfirstpart + str(iplastpart) #创建线程对象,存为th。线程要执行的函数由target指定,args指定参数,可以是元组~。线程号从1开始 th=threading.Thread(target=lanIp2Name,args=(iplastpart - intstart +1 ,targetip)) thread_pool.append(th) th.start() #阻塞主线程。collect all threads pos=intstart for pos in f: threading.Thread.join(thread_pool[pos-intstart])
#输出结果 hosts=range(0,len(list_of_name)) for host in hosts: print list_of_ip[host],' ====> ',list_of_name[host] print 'Find ',len(list_of_name),' Hosts.Done!' def lanIp2Name(t_id,ip): try: (name,aliaslist,addresslist)=socket.gethostbyaddr(ip) except: return
global g_mutex #再次声明 g_mutex.acquire() ######################受互斥量保护区代码################################## list_of_name.append(name) list_of_ip.append(ip) ######################################################################## g_mutex.release()
def lanIpToName(ip): try: (name,aliaslist,addresslist)=socket.gethostbyaddr(ip) except: return print name," ====> ",addresslist
def lanName2Ip(name): targetip=socket.gethostbyname(name) print name," ====> ",targetip ''' 一个.py文件,如果是自身在运行,那么他的__name__值就是"__main__"; 如果它是被别的程序导入的(作为一个模块),则__name__就不是__main__ ''' if '__main__' == __name__: ''' sys.argv[]是用来获取命令行参数的,sys.argv[0]表示代码本身文件路径 array.count(x) 返回出现的x的次数 ''' if len(sys.argv)< 3 : print "参数错误" showInfo() exit(1) cmds = ['-all', '-ip','-hostname'] cmd = sys.argv[1] target=sys.argv[2] if 0 == cmds.count(cmd): print cmd print "参数错误啊" showInfo() exit(1) else: print 'Start working,Please waiting...' if cmd == '-all': lanAll(target) elif cmd == '-ip': lanIpToName(target)
elif cmd=='-hostname': lanName2Ip(target)