socket.error: (9, 'Bad file descriptor')

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

ho,ho, ho, wasn das fuer ein feherl, warum?

Code: Alles auswählen

Connected by ('127.0.0.1', 33264)
DEBUG eine action
Traceback (most recent call last):
  File "/home/hmm/Desktop/remin/main.py", line 136, in ?
    handleClient(conn, addr)
  File "/home/hmm/Desktop/remin/main.py", line 42, in handleClient
    resp =socket.recv(512)
  File "/usr/lib/python2.4/socket.py", line 136, in _dummy
    raise error(EBADF, 'Bad file descriptor')
socket.error: (9, 'Bad file descriptor')
und der code (noch eien baustelle):

Code: Alles auswählen

import socket
import cgi

class Season:
	def __init__(self):
		self.data = {}
	
	def get(self, varName):
		return self.data[varName]
	
	def set(self, varName, value):
		self.data[varname] = value
	
	def addDict(self, varname, value):
		self.data[varname].update(value)
	
	def addList(self, varname, value):
		self.data[varname].append(value)
	
	def rm(self, varName):
		del self.data[varname] #vieleicht anderes

class Utils:
	def check(self, dict, *keys):

		for key in keys:
			if not dict.has_key():
				return False
		return True
	
	def formatCmds(self, dict):
		retval = ""
		for key, val in dict.iteritems():
			retval+= "<br><br><center>---"+ key +"---</center><br>" + val
		return retval
		
			
	

def handleClient(socket, ip):
	resp =socket.recv(512)
	method, req, proto = resp.split(" ", 2)#vileicht auch 2
	#try:
	if method == "GET":
			try:
				query = req.split("?")[1]
			except:
				query = ""
	elif method == "POST":
		query = resp.split("\r\n\r\n")[1]
	#except.. . .er.b
	param = cgi.parse_qs(query)
	
	html = ""
	if param.has_key("action"):
		print "DEBUG eine action"
		action = param["action"]
		if not SEASONS.has_key(ip):
			socket.send("access denied!!!, login first")
			socket.close()
			return
		
		if action == "login":
			if not utils.check(param, "login", "pwd"):
				socket.send(utils.missingInputs())
				socket.close()
				return
			if param["login"] in users.keys() and users[param["login"]] == param["pwd"]:
				SEASONS.update({ip: Season()})
			else:
				html+= "false password or username"
		
		elif action == "cmd":
			
			if param.has_key(cmd):#noch clear implementieren
				cmdResp = os.system(cmd)#vieleicht anderes
				SEASON[ip].set({})
				SEASON[ip].addDict({cmd: cmdResp})
				
			
			html+= """
			<html>
			<body>
			
			<table height=100% width=100% border=3>
			<tr>
			<td>
			<form action="" method="get">
			cmd <input name="cmd" size="20">
			<input type="hidden" name="action" value="cmd">
			<input type="submit" value="r00t">
			</form>
			</td>
			<td>
			""" + utils.formatCmds(cmds) + """
			</td>
			</tr>
			</table>
			
			
			"""
				
		elif action == "edit":
			pass
	else: #also keine action
		print "DEBUG keine action"
		html+= """
		<html>
		<body>

		<form action="" method="get">
		login: <input name="login" size="20"><br>
		password: <input name="pwd" type:password size="20"><br>
		<input type="hidden" name="action" value="login">
		<input type="submit" value="login">
		</form>

		</body>
		</html>
		"""
	socket.send(html)	
	socket.close()#################
	
if __name__ == "__main__":
	global utils #ist gloabal noetig?
	utils = Utils()
	global SEASONS
	SEASONS = {} #ist gloabal noetig?
	s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
	s.bind(("", 80))
	s.listen(10)
	conn, addr = s.accept()
	print 'Connected by', addr
	while 1:
		handleClient(conn, addr)
	conn.close()
	
print "test"
cp != mv
BlackJack

Wie man an der DEBUG-Ausgabe sieht funktioniert die Funktion einmal. Am Ende schliesst Du die Verbindung und beim nächsten Aufruf versuchst Du etwas über eine geschlossene Verbindung zu empfangen.
Costi
User
Beiträge: 545
Registriert: Donnerstag 17. August 2006, 14:21

ahhh, stimmt, thx
mein while 1 steht an der falschen stelle
cp != mv
Antworten