Seite 1 von 1

von socket erben ???

Verfasst: Dienstag 13. Februar 2007, 16:55
von cime
hallo,

ich habe ein großes problem und kapier einfach nicht, wo mein fehler ist. Ich habe eine klasse mysocket geschrieben, die von socket erbt. da ich gleich die verschlüsselung mit einarbeiten wollte, habe ich einfach send überschrieben. leider verwendet python bei testen des programms aber immer noch die alte send funktion von socket. Wisst ihr, wo da python ein problem machen könnte?? Schon einmal Danke im voraus, dass ihr euch damit beschäftigt.

hier der quellcode, ich habe mal die irrelevanten zeilen weggelassen:

Code: Alles auswählen

def crypt_xor(string,key):
    len_key=len(key)
    new=''
    for i in xrange(len(string)):
        new+=chr((ord(string[i])) ^ (ord(key[i%len_key])))
    return new

class mysocket(socket):
    def __init__(self,key_path=None,_sock=None,_key=None):
        print "__init__"
        socket.__init__(self,_sock=_sock)
        if _key:
            self.key=_key
        else:
            try:
                f=open(key_path,'rb')
                self.key=f.read(16)#16*8 == 128 bit Verschlüsselung
                f.close()
            except IOError,txt:
                raise KeyFileError,txt
        if len(self.key)!=16:
            raise KeyFileError,"not a valid 128 bit (16 byte) key (too short)"
        #print repr(self.key)
        #print repr(crypt_xor("Hallo",self.key))
    def send(self,string):
        print "send"
        print "gesendet: ",repr(crypt_xor(string,self.key))
        socket.send(self,crypt_xor(string,self.key))
    def recv(self,buffer):
        print "recv"
        if buffer%16!=0:
            return None #because it may cause problems with the decryption
        return crypt_xor(socket.recv(buffer),self.key)
    def accept(self):
        print "accept"
        sock, addr = self._sock.accept()
        return mysocket(_sock=sock,_key=self.key), addr
PS: die prints habe ich nur ersteinmal zum Debuggen eingefügt

Verfasst: Donnerstag 15. Februar 2007, 21:09
von cime
da ich einfach keine antwort auf dieses problem finde und scheinbar auch keiner von euch eine idee hat .... weiss jemand von euch, wo man sich da am besten hinwendet??? (PS: habe es erst mal uebergangsweise so geloest, dass ich in der klasse mysocket ein normales socket erzeuge und dann damit arbeite ...)

mfg
cime

Verfasst: Freitag 16. Februar 2007, 10:10
von apollo13
Poste bitte mal ein Beispiel wie du das Skript aufrufst

Verfasst: Freitag 16. Februar 2007, 10:23
von Rebecca
Ich hatte mir dieses kleine, etwas einfachere Script gebastelt, was das gleiche Problem hat:

Code: Alles auswählen

#!/user/bin/env/python

import socket

class mysocket(socket.socket):
    def __init__(self, _sock=None):
        print "__init__"
        socket.socket.__init__(self, _sock=_sock)
        
    def send(self, string):
        print "send"
        socket.socket.send(self, "---" + string + "---")
        
    def recv(self, buffer):
        print "recv"
        return socket.socket.recv(self, buffer)
    
    def accept(self):
        print "accept"
        sock, addr = self._sock.accept()
        return mysocket(_sock=sock), addr    


server = mysocket()
server.bind(("localhost", 3333))
server.listen(3)

s2 = mysocket()
s2.connect(("localhost", 3333))

(s1, address) = server.accept()

print s1, s2

s2.send("foo")
s1.send("bar")

print s1.recv(3)
print s2.recv(3)

s1.close()
s2.close()

server.close()
Ausgabe:

Code: Alles auswählen

__init__
__init__
accept
__init__
<__main__.mysocket object at 0x402c6ecc> <__main__.mysocket object at 0x402c6e9c>
foo
bar
Ich bin aber genauso ratlos. Beim accept klappt das Ueberschreiben, bei send und recv nicht...

Verfasst: Freitag 16. Februar 2007, 11:20
von rayo
Hi

Also nachdem ich mir mal ein wenig den Quelltext von socket.py ist mir auch klar warum das so ist.

Die Methoden deiner Mysocket-Class werden ja beim ersten durchlauf gesetzt (also bevor ein __init__ aufgerufen wird)

Jetzt steht im __init__ von socket ein kleiner Teil, der send, usw mit setattr überschreibt. Darum sind dann deine Methoden nicht mehr vorhanden und wurden durch die Methoden des Sockets ersetzt:

Code: Alles auswählen

    def __init__(self, family=AF_INET, type=SOCK_STREAM, proto=0, _sock=None):
        if _sock is None:
            _sock = _realsocket(family, type, proto)
        self._sock = _sock
        for method in _delegate_methods:
            setattr(self, method, getattr(_sock, method))
wobei _delegate_methods

Code: Alles auswählen

_delegate_methods = ("recv", "recvfrom", "recv_into", "recvfrom_into",
                     "send", "sendto")
entspricht.

Irgendwie ist das socket-Objekt nicht so schön implementiert.

Gruss

Verfasst: Freitag 16. Februar 2007, 14:40
von cime
hi rayo ...

danke dir ... ich bin manchmal echt durch den wind, ich habs einfach nicht gesehen thx

ciao & mfg
cime