寫了一個迴圈檢測埠的程式,迴圈的次數多了,會報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臺伺服器的埠不在出錯,執行測試了一天沒有問題。