Kommunizieren

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Benutzeravatar
jbs
User
Beiträge: 953
Registriert: Mittwoch 24. Juni 2009, 13:13
Wohnort: Postdam

[url=http://wiki.python-forum.de/PEP%208%20%28%C3%9Cbersetzung%29]PEP 8[/url] - Quak!
[url=http://tutorial.pocoo.org/index.html]Tutorial in Deutsch[/url]
coolerj
User
Beiträge: 49
Registriert: Sonntag 15. November 2009, 08:46

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
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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?)
ms4py
User
Beiträge: 1178
Registriert: Montag 19. Januar 2009, 09:37

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.
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.
coolerj
User
Beiträge: 49
Registriert: Sonntag 15. November 2009, 08:46

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."
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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.
coolerj
User
Beiträge: 49
Registriert: Sonntag 15. November 2009, 08:46

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()
XXLTomate
User
Beiträge: 7
Registriert: Sonntag 14. März 2010, 15:53

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()
Zuletzt geändert von XXLTomate am Montag 6. Juni 2011, 17:10, insgesamt 1-mal geändert.
Benutzeravatar
Hyperion
Moderator
Beiträge: 7478
Registriert: Freitag 4. August 2006, 14:56
Wohnort: Hamburg
Kontaktdaten:

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 ;-)
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

XXLTomate hat geschrieben:*ich hoff ich habs nicht verwechselt :-)
Nicht nur das. Du solltest vielleicht noch einmal die Wikipedia-Artikel dazu lesen ;-)
Das Leben ist wie ein Tennisball.
XXLTomate
User
Beiträge: 7
Registriert: Sonntag 14. März 2010, 15:53

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
Leonidas
Python-Forum Veteran
Beiträge: 16025
Registriert: Freitag 20. Juni 2003, 16:30
Kontaktdaten:

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.
My god, it's full of CARs! | Leonidasvoice vs (former) Modvoice
Benutzeravatar
mkesper
User
Beiträge: 919
Registriert: Montag 20. November 2006, 15:48
Wohnort: formerly known as mkallas
Kontaktdaten:

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:
XXLTomate
User
Beiträge: 7
Registriert: Sonntag 14. März 2010, 15:53

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?
Benutzeravatar
Rebecca
User
Beiträge: 1662
Registriert: Freitag 3. Februar 2006, 12:28
Wohnort: DN, Heimat: HB
Kontaktdaten:

So ziemlich alles was du ueber TCP und UDP gesagt hast. Und benutze bitte kein while 1.
Offizielles Python-Tutorial (Deutsche Version)

Urheberrecht, Datenschutz, Informationsfreiheit: Piratenpartei
Benutzeravatar
cofi
Python-Forum Veteran
Beiträge: 4432
Registriert: Sonntag 30. März 2008, 04:16
Wohnort: RGFybXN0YWR0

Rebecca hat geschrieben:Und benutze bitte kein while 1.
Und schon gar kein `while(1)`
XXLTomate
User
Beiträge: 7
Registriert: Sonntag 14. März 2010, 15:53

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.
EyDu
User
Beiträge: 4881
Registriert: Donnerstag 20. Juli 2006, 23:06
Wohnort: Berlin

Ich habe doch auf den Fehler und Wikipedia hingewiesen. Warum sollte hier jemand noch einmal vorkauen, was an anderer Stelle bereits ausführlich steht?
Das Leben ist wie ein Tennisball.
coolerj
User
Beiträge: 49
Registriert: Sonntag 15. November 2009, 08:46

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()
Antworten