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

关注者
5
被浏览
24,658

2 个回答

这类问题最好贴代码.

基本上发生的原因就是某个分支或者异常处理已经把连接关闭了,但是外面的大循环还在试图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 <module>
    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)