Seite 1 von 1

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

Verfasst: Sonntag 24. Dezember 2006, 18:55
von Costi
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"

Verfasst: Sonntag 24. Dezember 2006, 19:36
von 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.

Verfasst: Sonntag 24. Dezember 2006, 21:01
von Costi
ahhh, stimmt, thx
mein while 1 steht an der falschen stelle