socket.recv blockt nicht

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
bsimpson888
User
Beiträge: 4
Registriert: Dienstag 23. Juni 2009, 16:05

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
BlackJack

Wenn man nichts am Socket verändert, sollte `recv()` blockieren. Also hör einfach auf am Socket "rumzufummeln". ;-)
bsimpson888
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.
Benutzeravatar
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.
bsimpson888
User
Beiträge: 4
Registriert: Dienstag 23. Juni 2009, 16:05

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