寫了一個迴圈檢測埠的程式,迴圈的次數多了,會報Errno 9: Bad file descriptor in python socket錯誤。程式如下:

def Scan_port(host,port):
    s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    #socket.setdefaulttimeout(10)
    s.settimeout(10)
    t = 1
    while 1:
        try:
            s.connect((host,port))
            s.close()
            break
        except socket.error, e:
            s.close()
            if t > 3:
                print e
                break
            else:
                t = t + 1
                time.sleep(1)

   socket連線超時時間為10s,超時之後重試3次,3次依然連線不到或是超時,則拋錯。這個函式加入到多執行緒,多個主機時就會報Errno 9: Bad file descriptor in python socket錯誤。查詢了材料,都說是s.close()在迴圈裡面是主線問題的主要原因,不管s.close()在迴圈中的那個位置都會出現這個錯誤。後修改了這段程式碼如下:

def Scan_port(host,port):
    t = 1
    while 1:
        s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        #socket.setdefaulttimeout(10)
        s.settimeout(10)
            try:
                s.connect((host,port))
                s.close()
                break
            except socket.error, e:
                s.close()
                if t > 3:
                    print e
                    break
                else:
                    t = t + 1
                    time.sleep(1)

   把初始化socket提進迴圈中,經測試2000臺伺服器的埠不在出錯,執行測試了一天沒有問題。