python socket.error: [Errno 9] Bad file descriptor什麼原因?


這類問題最好貼代碼.

基本上發生的原因就是某個分支或者異常處理已經把連接關閉了,但是外面的大循環還在試圖send/recv.

舉個例子

while (1):

rc = conn.recv(5)

pipe = os.popen(rc)

rl = pipe.readlines()

file = conn.makefile("w", 0)

file.writelines(rl[:-1])

file.close()

conn.close()


socket關閉錯誤,需要等待數據發完之後才能關閉。(錯誤代碼已屏蔽)

異常提示:

Traceback (most recent call last):
File "test1.py", line 21, in &
readableList,writeableList,exceptList = select.select(socketList,[],[])
File "/usr/lib/python2.7/socket.py", line 228, in meth
return getattr(self._sock,name)(*args)
File "/usr/lib/python2.7/socket.py", line 174, in _dummy
raise error(EBADF, "Bad file descriptor")
socket.error: [Errno 9] Bad file descriptor

錯誤demo:

#coding=utf-8

#導入模板
from socket import *
import select
#創建服務端套接字
servSocket = socket(AF_INET,SOCK_STREAM)
#綁定
bindAddr = ("",7801)
servSocket.bind(bindAddr)
#設置伺服器為listen狀態
servSocket.listen(5)
socketList = [servSocket]
#循環
while True:
readableList,writeableList,exceptList = select.select(socketList,[],[])
print("等待客戶端鏈接...")
#遍歷套接字列表,如果可讀套接字為serv,則需要建立新的客服套接字
for sockTemp in readableList:
if sockTemp == servSocket:
newSocket,destAddr = servSocket.accept()
print("客戶端正在請求鏈接...")
# 將客服套接字添加到列表中
socketList.append(newSocket)

#否則,說明客戶端正在發送數據
else:
recvData = sockTemp.recv(1024)

#如果接收內容不為空,則說明有客戶端數據返回
if len(recvData)&>0:
#測試:將內容閃回
sockTemp.send(recvData)
#測試:列印內容
print("接收到客戶端發送的內容%s"%recvData)
#否則,說明客戶端沒有發送內容,移除
else:
socketList.remove(sockTemp)
"""
出錯位置
"""
# sockTemp.close()
#關閉套接字
sockTemp.close()
#關閉伺服器
servSocket.close()

參考資料:

  1. Python socket (Socket Error Bad File Descriptor)

  2. python - What could be the reason for a socket error "[Errno 9] Bad file descriptor"

  3. python網路編程報錯socket.error: [Errno 9] Bad file descriptor


推薦閱讀:

運行不了 頭大。新手 想學Qt 最簡單的helloword 都運行不了 求教!?
為什麼有道詞典默認安裝在C:Documents and Settings 而不是C:Program Files?出於什麼考慮?

TAG:Python | file | 軟體調試 |