Hallo zusammen,
ich sitze gerade an nem kleinen script welches ein Problem damit hat , dass selbst wenn ich den socket den es benutzt auf blocking schalte, socket.recv() nicht blockt. D.h. wenn im Puffer nix anliegt liefert der Befehl einen Leerstring.
Hat jemand schon ein ähnliches Problem , bzw. ne Lösung dafür gehabt ?
Wäre für Tips sehr dankbar.
Greets,
Marco
socket.recv blockt nicht
Wenn man nichts am Socket verändert, sollte `recv()` blockieren. Also hör einfach auf am Socket "rumzufummeln".
-
- User
- Beiträge: 4
- Registriert: Dienstag 23. Juni 2009, 16:05
Also ich hab mehrere tests gemacht,
sowohl mit einem nicht "gefummelten" socket , als auch mit expleziten setzen von setblocking(1). Des weiteren hab ich meinen hand gebastelten socket server schon durch SocketServer ersetzt und auch das an den Handler übergebene socket objekt blockt bei recv nicht. Ich muss vielleicht erwähnen das ich das ganze bis jetzt nur auf Python 2.6 ausprobiert habe. Vielleicht verhält sich das ganze auf einer anderen Python Version richtig.
sowohl mit einem nicht "gefummelten" socket , als auch mit expleziten setzen von setblocking(1). Des weiteren hab ich meinen hand gebastelten socket server schon durch SocketServer ersetzt und auch das an den Handler übergebene socket objekt blockt bei recv nicht. Ich muss vielleicht erwähnen das ich das ganze bis jetzt nur auf Python 2.6 ausprobiert habe. Vielleicht verhält sich das ganze auf einer anderen Python Version richtig.
- Defnull
- User
- Beiträge: 778
- Registriert: Donnerstag 18. Juni 2009, 22:09
- Wohnort: Göttingen
- Kontaktdaten:
Es wäre hilfreich, wenn du uns die besagten Test-Codes zukommen lassen würdest. Die Wahrscheinlichkeit, das du darin einen Fehler gemacht hast, ist nämlich deutlich höher, als die für einen Bug in Python.
-
- User
- Beiträge: 4
- Registriert: Dienstag 23. Juni 2009, 16:05
Das letzte was ich versucht habe war folgendes
Der Client öffnet die Verbindung und sendet nix. Die Ausgabe sieht dann folgender massen aus:
Code: Alles auswählen
#!/usr/bin/python
import time, threading
from mcbsp_tcpmsg import *
from i2cbus import *
import SocketServer
class mcbsp_bushandler(SocketServer.BaseRequestHandler, mcbsp_tcpmsg):
def tohex(self,data):
ret = ""
for d in data:
i = ord(d)
h = "%02x " % i
ret +=h
return(ret)
def handle(self):
self.conn = self.request
message = ""
lastcmd = chr(0)
cmd = ""
while lastcmd!=self.MSGCommunicationEnd:
cmd = self.conn.recv(1)
if cmd == self.MSGStart:
message = self.tohex(self.MSGStart)+" "
if cmd == self.MSGGetProtocolVersion:
version = chr(1)+chr(0)+chr(0)
self.conn.send(version)
message+=self.tohex(version)
if cmd == self.MSGEnd:
print message
if cmd == self.MSGCommunicationEnd:
print "closing..."
lastcmd = cmd
print "blub %i" % len(cmd)
self.conn.close()
return
class mcbsp_busdaemon(SocketServer.ThreadingMixIn, SocketServer.TCPServer):
def server_bind(self):
self.socket.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
self.socket.bind(self.server_address)
if __name__ == "__main__":
HOST, PORT = "localhost", 8134
server = mcbsp_busdaemon((HOST, PORT),mcbsp_bushandler)
ip, port = server.server_address
server_thread = threading.Thread(target=server.serve_forever)
server_thread.setDaemon(True)
server_thread.start()
while 1:
time.sleep(1)
Der Client öffnet die Verbindung und sendet nix. Die Ausgabe sieht dann folgender massen aus:
Code: Alles auswählen
blub 0
blub 0
blub 0
blub 0
blub 0
blub 0
blub 0
blub 0
.
.
.
.