Seite 1 von 3

Verfasst: Sonntag 14. März 2010, 13:05
von jbs

Verfasst: Sonntag 14. März 2010, 13:23
von coolerj
Ich möchte doch nur den Fehler Errno 10054 ignorieren und wenn der auftaucht das der server weiter läuft und wenn der Fehler auftretet was besonderes ausführt

Verfasst: Sonntag 14. März 2010, 13:40
von Hyperion
Hast Du uns eigentlisch schon mal erklärt, wieso Du mit Sockets arbeiten willst? (Du schriebst ja nur, dass Du Dir jede Menge Probleme einhandeln willst - aber wieso nur?)

Verfasst: Sonntag 14. März 2010, 14:17
von ms4py
Hyperion hat geschrieben:Hast Du uns eigentlisch schon mal erklärt, wieso Du mit Sockets arbeiten willst? (Du schriebst ja nur, dass Du Dir jede Menge Probleme einhandeln willst - aber wieso nur?)
Vor allem weil du noch ein ziemlicher Neuling zu sein scheinst, und es damit nicht nur dir, sondern momentan auch uns sehr schwer machst ;)

Für Programmierer mit wenig Python-Erfahrung empfiehlt es sich sehr, auf eine Lösung zu setzen, die das ganze Sockethandling abstrahiert.

Verfasst: Sonntag 14. März 2010, 14:32
von BlackJack
@coolerj: `socket.error` hat als `args`-Attribut ein Tupel das als erstes Element die Fehlernummer und als zweites den Text enthält.

Allerdings sind beide Betriebssystemabhängig.

Verfasst: Sonntag 14. März 2010, 19:28
von coolerj
Ok ihr wollt mir nicht helfen sagst doch gleich.

Damit kommt zwar die meldung aber stürtz immer noch ab:

Code: Alles auswählen

if socket.error(10054):
                print "Es hat einer eine Verbindung getrennt."

Verfasst: Sonntag 14. März 2010, 20:04
von Hyperion
coolerj hat geschrieben:Ok ihr wollt mir nicht helfen sagst doch gleich.
Ok, Du willst uns nicht antworten. :roll:
...
...
...
...
...
...
Denk doch mal drüber nach, was es bedeutet, wenn sich jemand die Mühe macht inhaltliche Rückfragen an Dich zu stellen! Und wenn Du das richtig analysiert hast, denk noch mal über Deine Aussage nach und reagiere in Zukunft einfach angemessen.

Aber um Dich jetzt glücklich zu machen:

Code: Alles auswählen

try:
    # was auch immer Du machst
except socket.error as error:
    print error
Damit sollte im Fehlerfall die Exception abgefangen und die Nachricht ausgegeben werden. Wie Du dann "weiter" machen kannst mit Deinem Code hängt vom konkreten Anwendungsfall ab.

Verfasst: Sonntag 14. März 2010, 20:19
von coolerj
Aber dann bricht er ja wieder ab.

Code: Alles auswählen

import socket
import shutil

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind(("", 50000)) 
s.listen(1)

try: 
    while True: 
        komm, addr = s.accept() 
        while True: 
            data = komm.recv(1024)

            if not data: 
                komm.close() 
                break


            #print "[%s] %s" % (addr[0], data)
            array = data.split()
            datei = "log.txt";
            if array[0] == "/kill":
                print "[%s] hat die Funktion 'kill' aufgerufen" % (addr[0])
                files = open(datei,"a")
                files.write("\n[%s] hat die Funktion 'kill' aufgerufen\n" % (addr[0]))
                files.write("[%s]" % (data))
                files.close()

            if array[0] == "/set":
                print "[%s] hat die Funktion 'set' aufgerufen" % (addr[0])
                files = open(datei,"a")
                files.write("\n[%s] hat die Funktion 'set' aufgerufen\n" % (addr[0]))
                files.write("[%s]" % (data))
                files.close()

            if array[0] == "/move":
                print "[%s] hat die Funktion 'move' aufgerufen" % (addr[0])
                files = open(datei,"a")
                files.write("\n[%s] hat die Funktion 'move' aufgerufen\n" % (addr[0]))
                files.write("[%s]" % (data))
                files.close()

            if array[0] == "/archiv":
                shutil.move(datei, "./archiv/%s-log.txt" % (array[1]))

            if socket.error(10054):
                print "Es hat einer eine Verbindung getrennt."

except socket.error as error:
    print error 
           
finally: 
    s.close()

Verfasst: Sonntag 14. März 2010, 20:29
von XXLTomate
Hiho also wenn du unbedingt sockets benutzen willst:
ein paar Tipps am Rande:
-keinen Port unter 1024 benutzen, die brauchen root rechte
-bei dem Beispiel hier ist es egal ob der server an ist, der client schickt einfach man drauf los (UDP)
-falls du was wieder vom Server zum Client zurückschicken willst brauchst du TCP
-falls du von außerhalb deines Netztwerkes was zu dir schicken willst musst du die ports in deinem router freigeben

Hier 2 Code snippets die ich ohne weitere Änderungen und so auch ohne Garantie einfach mal hier reinkopiere, vielleicht helfen sie weiter ;-)

server.py (zum empfangen)

Code: Alles auswählen

#!/usr/bin/env python
#THIS IS ONLY AN EXAMPLE CODE

# Server

import socket

s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
host = '' # Auf dem server kann man das leer lassen
#~ port = int(sys.argv[1])
port = 12345
s.bind((host, port))
print "===Server gestartet==="

while True:
	data,addr = s.recvfrom(1024)
	print "Got data ==>" + data
s.close()
client.py (zum senden)

Code: Alles auswählen

#!/usr/bin/env python
#THIS IS ONLY AN EXAMPLE CODE

# Client

import socket

# Socket
s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)


#~ host = sys.argv[1] 
#~ port = int(sys.argv[2]) 
host = 'localhost'
port = 12345

s.sendto("Client connected",(host, port))
print "====Client gestartet==="
v = ''
t = ''

while True:
	input = raw_input("Was soll ich senden? ")
	s.sendto(input,(host, port))
	
s.close()

Verfasst: Sonntag 14. März 2010, 20:40
von Hyperion
Dann musst Du den try...except Block eben in die Schleife(en) verlegen... man sollte i.A. immer nur so wenig Code wie möglich in solche Blöcke legen und vor allem nur wirklich um die Stellen, an denen eine Exception möglich ist.

In Deinem Fall nehme ich mal an, dass das s.accept() diese Exception wirft? (Oder das komm.recv() ?) Dann musst Du den Block eben nur um diese Stelle basteln.

Mal so am Rande ist der Code in der "Mitte" auch ziemliche copy&paste Programmierung. Wieso immer wieder eine Datei öffnen und den selben formatierten Text da rein schreiben? Zudem: Es gibt ein prima logging-Modul - evtl. wäre das eine Alternative?

Und den Rest kannst Du auch besser mit einem Dictionary zusammenfassen:

Code: Alles auswählen

def handle_cmd(filename, sender, data, cmd):
    message = u"[{0}] hat die Funktion '{1}' aufgerufen".format(sender, cmd)
    with open(filename, "a") as outfile:
        outfile.write(message)
        outfile.write(u"[{0}]".format(data))
    print message


def handle_archiv(filename, sender, data, cmd):
    shutil.move(datei, r"./archiv/%s-log.txt".format(data.split()[1]))


def listen():
    """
    lagere alle Netzwerkkommunikation hier rein
    """
    commands = {
        "/kill": handle_cmd,
        "/set": handle_cmd,
        "/move": handle_cmd,
        "/archiv": handle_archiv
    }
    filename = r"was auch immer"
    # Stelle an der sonst diese if-Kaskade auftaucht:
    commands[array[0]](filename, addr[0], data, array[0])
    # und weiter
Und zur Erinnerung: Du bist immer noch nicht auf die Frage eingegangen, wieso Du "das" mit sockets lösen willst ;-)

Verfasst: Sonntag 14. März 2010, 20:56
von EyDu
XXLTomate hat geschrieben:*ich hoff ich habs nicht verwechselt :-)
Nicht nur das. Du solltest vielleicht noch einmal die Wikipedia-Artikel dazu lesen ;-)

Verfasst: Sonntag 14. März 2010, 22:38
von XXLTomate
EyDu hat geschrieben:
XXLTomate hat geschrieben:*ich hoff ich habs nicht verwechselt :-)
Nicht nur das. Du solltest vielleicht noch einmal die Wikipedia-Artikel dazu lesen ;-)
Hatte ich jetzt auf die schnelle keine lust :-). hab das mit den sockets vor ein paar jahren mal gemacht und konnte mich nicht mehr ganz dran erinnern :D

Verfasst: Sonntag 14. März 2010, 23:37
von Leonidas
XXLTomate hat geschrieben:Hatte ich jetzt auf die schnelle keine lust :-). hab das mit den sockets vor ein paar jahren mal gemacht und konnte mich nicht mehr ganz dran erinnern :D
Nichts für ungut, aber vielleicht sollte man dann lieber nicht posten, denn das was dort steht ist teilweise so falsch, dass man hofft dass das keiner ernst nimmt.

Verfasst: Montag 15. März 2010, 09:27
von mkesper
Wieso hört eigentlich kein Newbie, was ihm vorgeschlagen wird?
"Ich verstehe zwar nichts von Python, aber was Ihr mir vorschlagt, will ich nicht!!1111"
:cry: :K :evil:

Verfasst: Montag 15. März 2010, 12:54
von XXLTomate
Leonidas hat geschrieben:
XXLTomate hat geschrieben:Hatte ich jetzt auf die schnelle keine lust :-). hab das mit den sockets vor ein paar jahren mal gemacht und konnte mich nicht mehr ganz dran erinnern :D
Nichts für ungut, aber vielleicht sollte man dann lieber nicht posten, denn das was dort steht ist teilweise so falsch, dass man hofft dass das keiner ernst nimmt.
lol was ist daran so falsch?

Verfasst: Montag 15. März 2010, 13:44
von Rebecca
So ziemlich alles was du ueber TCP und UDP gesagt hast. Und benutze bitte kein while 1.

Verfasst: Montag 15. März 2010, 13:49
von cofi
Rebecca hat geschrieben:Und benutze bitte kein while 1.
Und schon gar kein `while(1)`

Verfasst: Montag 15. März 2010, 16:24
von XXLTomate
Rebecca hat geschrieben:So ziemlich alles was du ueber TCP und UDP gesagt hast.
Ja dann könnt ihr das hier ja richtig stellen und nicht nur "is falsch" sagen, so bringt es weder mir noch jemand anderem was.

Verfasst: Montag 15. März 2010, 16:37
von EyDu
Ich habe doch auf den Fehler und Wikipedia hingewiesen. Warum sollte hier jemand noch einmal vorkauen, was an anderer Stelle bereits ausführlich steht?

Verfasst: Montag 15. März 2010, 18:52
von coolerj
Wollt ihr mich Verarschen ich jetzt den block in der Schleife getan aber dann geht garnichts mehr

Code: Alles auswählen

import socket
import shutil

s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) 
s.bind(("", 50000)) 
s.listen(1)

try:
    while True: 
        komm, addr = s.accept() 
        while True: 
            data = komm.recv(1024)

            if not data: 
                komm.close() 
                break

            #print "[%s] %s" % (addr[0], data)
            array = data.split()
            datei = "log.txt";
            if array[0] == "/kill":
                print "[%s] hat die Funktion 'kill' aufgerufen" % (addr[0])
                files = open(datei,"a")
                files.write("\n[%s] hat die Funktion 'kill' aufgerufen\n" % (addr[0]))
                files.write("[%s]" % (data))
                files.close()
    
            if array[0] == "/set":
                print "[%s] hat die Funktion 'set' aufgerufen" % (addr[0])
                files = open(datei,"a")
                files.write("\n[%s] hat die Funktion 'set' aufgerufen\n" % (addr[0]))
                files.write("[%s]" % (data))
                files.close()

            if array[0] == "/move":
                print "[%s] hat die Funktion 'move' aufgerufen" % (addr[0])
                files = open(datei,"a")
                files.write("\n[%s] hat die Funktion 'move' aufgerufen\n" % (addr[0]))
                files.write("[%s]" % (data))
                files.close()

            if array[0] == "/archiv":
                shutil.move(datei, "./archiv/%s-log.txt" % (array[1]))

    except socket.error as error:
        if socket.error(10054):
            print "Es hat einer eine Verbindung getrennt."
           
finally: 
    s.close()