von socket erben ???

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

Dienstag 13. Februar 2007, 16:55

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
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

Donnerstag 15. Februar 2007, 21:09

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
apollo13
User
Beiträge: 827
Registriert: Samstag 5. Februar 2005, 17:53

Freitag 16. Februar 2007, 10:10

Poste bitte mal ein Beispiel wie du das Skript aufrufst
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

Freitag 16. Februar 2007, 10:23

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...
rayo
User
Beiträge: 773
Registriert: Mittwoch 5. November 2003, 18:06
Wohnort: Schweiz
Kontaktdaten:

Freitag 16. Februar 2007, 11:20

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
cime
User
Beiträge: 152
Registriert: Dienstag 24. Mai 2005, 15:49

Freitag 16. Februar 2007, 14:40

hi rayo ...

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

ciao & mfg
cime
Antworten