天天看點

python--區域網路IP+使用者名 開始程式是單線程的,跑255個主機,我暈,好像要10~20分鐘吧,真坑爹~~

開始程式是單線程的,跑255個主機,我暈,好像要10~20分鐘吧,真坑爹~~

後來改為了多線程的了,幾秒鐘就可以出結果哦~~

python--區域網路IP+使用者名 開始程式是單線程的,跑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)