Seite 1 von 1

socket.recv blockt nicht

Verfasst: Freitag 26. Juni 2009, 00:13
von bsimpson888
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

Verfasst: Freitag 26. Juni 2009, 00:28
von BlackJack
Wenn man nichts am Socket verändert, sollte `recv()` blockieren. Also hör einfach auf am Socket "rumzufummeln". ;-)

Verfasst: Freitag 26. Juni 2009, 10:33
von bsimpson888
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.

Verfasst: Freitag 26. Juni 2009, 11:37
von Defnull
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.

Verfasst: Freitag 26. Juni 2009, 12:48
von bsimpson888
Das letzte was ich versucht habe war folgendes

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
.
.
.
.