開始程式是單線程的,跑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)