IRC verliert immer die Verbindung wieso???

Sockets, TCP/IP, (XML-)RPC und ähnliche Themen gehören in dieses Forum
Antworten
downy
User
Beiträge: 6
Registriert: Freitag 16. Mai 2014, 15:27

Hallo, ich habe testweise einen IRC benutzer erstellt der via python zu einen Chat verbindet.
Bis hier hin alles gut, er verbindet macht alles was ich will ABER der bekommt bei ca. 10 minuten einen fehler und hört auf zu arbeiten wieso???

Fehler ist angeblich diese Zeile:

Code: Alles auswählen

user = data.split(':')[1]
hier ist der voll code, bitte um hilfe das der verbunden bleibt und nicht errors bekommt:

Code: Alles auswählen

import socket #imports module allowing connection to IRC
import threading #imports module allowing timing functions

#sets variables for connection to chat
bot_owner = '' 
nick = '' 
channel = '#' 
server = '' 
password = '' 

queue = 13 #sets variable for anti-spam queue functionality

irc = socket.socket()
irc.connect((server, 6667)) #connects to the server

#sends variables for connection to twitch chat
irc.send('PASS ' + password + '\r\n')
irc.send('USER ' + nick + ' 0 * :' + bot_owner + '\r\n')
irc.send('NICK ' + nick + '\r\n')
irc.send('JOIN ' + channel + '\r\n') 

while True:
    data = irc.recv(1204) #gets output from IRC server
    user = data.split(':')[1]
    user = user.split('!')[0] #determines the sender of the messages
    print data
Zuletzt geändert von downy am Freitag 16. Mai 2014, 15:52, insgesamt 1-mal geändert.
BlackJack

@downy: Was ist denn das für ein Fehler? Du wirst doch einen kompletten Traceback bekommen. Was an der Zeile zum Beispiel problematisch werden kann sind Daten in denen gar kein Doppelpunkt vorkommt.
downy
User
Beiträge: 6
Registriert: Freitag 16. Mai 2014, 15:27

Hi BlackJack, das ist die Fehlermeldung:

Bild

Habe auch schon versucht die variablen data um zuschreiben wie im screenshot, doch es kommt der gleiche fehler wie davor auch.
10 Minuten läuft alles gut, danach erst stürzt es mit dieser Fehlermldung ab.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

downy hat geschrieben:10 Minuten läuft alles gut, danach erst stürzt es mit dieser Fehlermldung ab.
Die Fehlermeldung sagt deutlich woran es liegt. Du versuchst auf das zweite Element der durch split erstellten Liste zuzugreifen. Dieses Element ist nicht vorhanden ("list index out of range"). Warum ist es nicht vorhanden? Das kann nur daran liegen, dass kein Doppelpunkt im String babadata vorhanden ist und dadurch nicht mindestens zwei Elemente vorhanden sind. Diesen Fall musst du berücksichtigen.
downy
User
Beiträge: 6
Registriert: Freitag 16. Mai 2014, 15:27

Hallo danke, soll es dann etwa so ausschauen (ohne Doppelpunkt)?:

Code: Alles auswählen

babauser = babadata.split('')[1]
oder soll ich den ganzen Teil (Zeile) weg lassen?
sorry ist erst meine erste Woche Python :P
BlackJack

@downy: Programmieren heisst nicht rumraten bis es irgendwie funktioniert und hoffentlich fehlerfrei ist.

Warum wird denn an der Stelle im Programm diese Zeichenkette am Doppelpunkt getrennt? Und warum ist da nach 10 Minuten mal kein Doppelpunkt drin? Wie sehen die Daten denn dann aus? Und was bedeuten sie? Du musst Dir doch irgend was beim Trennen an der Stelle gedacht haben.
downy
User
Beiträge: 6
Registriert: Freitag 16. Mai 2014, 15:27

die : dienen zum trennen der usernamen und passwort oder nicht?
außerdem hat es anscheinend garnichts damit zutun, wenn ihr das wisst warum gibt ihr mir dann nicht den schnipsel an code??

es lag am ping weil er keine antwort zurück gegeben hat, hat er ihn disconnected... naja viel glück noch mit eurem forum haha
wenn er kei nping gibts/bekommt, wird er gekickt und dann kann er die daten mit ":" natürlich nicht mehr auf den server andwenden...

woher soll man sowas wissen das ein irc jemanden disconnected wenn man 3 tage python macht und nichts über irc weiss, ihr seid ja eigentlich die profis naja.
vielleicht konntet ihr ja jetzt mal was lernen, nicht böse gemeint und sauer werden . :mrgreen: :K
BlackJack

@downy: Natürlich hat das etwas ”damit” zu tun. Wenn der Code genau an der Stelle mit einer Fehlermeldung aussteigt, dann muss ja genau an der Stelle etwas an den Daten sein mit denen der Code und damit der Programmierer so nicht gerechnet hat.

Wenn Du nicht weisst wie das Protokoll aussieht, dann kannst Du halt auch keinen Client dafür programmieren. Und nein, auch das verbasteln von anderer Leute Codeschnippseln ohne zu verstehen was da vor sich geht ist kein Programmieren. Am dritten Tag in Low-Level-Socket-Programmierung einzusteigen ist vielleicht auch keine gute Idee.

Der Code zum Auslesen des Datenstroms ist schon kaputt, weil viel zu einfach gestrickt. Das `recv()` kann 1 bis 1024 Bytes vom Anfang des Datenstroms lesen. Es ist dabei nicht an irgendwelche Grenzen gebunden was das Protokoll angeht was über diese Verbindung ”gesprochen” wird. Das heisst mit einem Aufruf kann man einen Teil einer Nachricht auf Protokollebene lesen, oder aber auch mehr als eine Nachricht. Man muss also explizit Code schreiben der sicherstellt das man mindestens eine komplette Nachricht empfangen hat, und die dann verarbeiten. Wobei man eventuelle komplette oder Teilnachrichten die man zusätzlich zur ersten gelesen hat, geeignet abarbeiten oder puffern muss.
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

downy hat geschrieben:es lag am ping weil er keine antwort zurück gegeben hat, hat er ihn disconnected
Das ist ja alles möglich, aber der Fehler lag eindeutig daran, dass in dem String den du gesplittet hast kein Doppelpunkt vorhanden war. Dein Code ist ohnehin nicht sonderlich robust.

Wenn du wirklich programmieren lernen möchtest, dann solltest du versuchen Probleme zu verstehen, statt herumzuraten und konkrete und korrekte Antworten einfach abzuqualifizieren. Wie du ja selbst festgestellt hast sind wir "die profis", also solltest du vielleicht mal über die Antworten nachdenken statt mit 3 Tagen Python-Erfahrung alles besser zu wissen glauben.
downy
User
Beiträge: 6
Registriert: Freitag 16. Mai 2014, 15:27

LoL, wer sagt das ich den ganzen code nicht verstehe?
Und wer sagt das ich den Code nicht schon übelts umgeschieben habe und er immernoch perfekt funktioniert?

Normal ist das ja nicht das aus dem nichts nach 10 minuten sowas kam... einfach eine ping abfrage dazu gepackt und die sache ist gegessen.

Ich bin eben einer "Learning by Doing", ich teste einfach alles um zu lernen.
Mein Code funktioniert jetzt perfekt, das Problem war der "PING". Das andere wurde vom "Ping" ausgelöst..
Habe sogar 2 am laufen, den anderen sogar unter "irc.recv(4096)".. keine probleme, keine disconnects.
Babas klären.. danke euch hehe
Benutzeravatar
/me
User
Beiträge: 3555
Registriert: Donnerstag 25. Juni 2009, 14:40
Wohnort: Bonn

downy hat geschrieben:Normal ist das ja nicht das aus dem nichts nach 10 minuten sowas kam... einfach eine ping abfrage dazu gepackt und die sache ist gegessen.
Du begreifst eine Sache immer noch nicht. Du hast jetzt diesen Fehler umgangen. Dein Code ist aber weiterhin fehlerhaft (siehe dazu auch BlackJacks Beitrag). Beim nächsten Zusammenbruch rätselst du wieder.

Nimm doch einfach mal konstruktive Kritik an.
downy
User
Beiträge: 6
Registriert: Freitag 16. Mai 2014, 15:27

Also ich programmiere mehrere sprachen, ua. VB .Net, VB6, Delphi, C# usw, deswegen habe ich schon einen vorteil das ich vieles kenne, es wird eben anders umgeschrieben.
Bezüglich des Clienten, es ist der Twitch.Tv Client wo ich keinen zugriff zu habe und ich mir die api vorher mehrmals schon durchgelesen habe, also kenne ich die materie schon gut.
Kritik und Konstuktive kritik sind auch 2 verschiedene Paar schuhe, wenn ihr mir geholfen hättet wäre das was anderes, nicht nur sagen ja da kommt der fehler her, das wusste ich ja auch weil es angezeigt wurde in der console, wenn twitch seine api bzw. source code wieder ändern sollte, dann passe ich es auch wieder an. Python war nur eine vorübergehende methode um es in VB .Net via Bat merhmals anzusprechen.. dieses hat sich aber jetzt geklärt, weil ich es umgeschrieben hab in VB .Net und viel flexibler jetzt bin und nicht immer die dateien bearbeiten muss.
Ich kann euch aber auch verstehen, Python und IRC sind auch wieder 2 verschiedene Paar schuhe, man soltle schon die Funktionsweisen von IRC Server 1-2 Tage min via google und co abchecken und lesen.
Bis jetzt läuft mein programm 1A :) peace
BlackJack

@downy: Du wusstest nicht was die direkte Ursache war, Du hast ja sogar die angezeigte Fehlerstelle in Zweifel gezogen. Was ein bisschen schwach ist wenn man angeblich schon in so vielen Sprachen programmieren kann, denn wenn Du das was wir Dir gesagt hatten alles schon gewusst hättest, dann hättest Du die Fehlerstelle und was `data` zu dem Zeitpunkt wo der Fehler auftritt tatsächlich an Daten enthält, ganz einfach ermitteln können. Und dann hättest Du verfolgt wo `data` her kommt, und in der Dokumentation erfahren unter welchen Umständen das genau diesen Wert haben kann. Da gibt es nämlich nur einen Grund für. Und dann hättest Du auch eine ganz andere Frage gestellt, die letztendlich nichts mit Python zu tun hat, sondern mit dem IRC-Protokoll. Dem wolltest Du aber nicht nachgehen und etwas dabei lernen, Du wolltest einfach nur fertigen Quelltext angeliefert bekommen und nicht verstehen und lernen wie man so einem Problem nachgeht. Auch bei der `recv()`-Problematik hatte ich nicht das Gefühl das Du auch nur ansatzweise versucht hast Dich damit auseinander zu setzen.

Du sagst Du kennst die Materie gut, hast aber keine Ahnung von Socket-Programmierung oder dem IRC-Protokoll, von welcher Materie ist denn dann bitte die Rede?
nomnom
User
Beiträge: 487
Registriert: Mittwoch 19. Mai 2010, 16:25

Bezüglich des Clienten, es ist der Twitch.Tv Client wo ich keinen zugriff zu habe und ich mir die api vorher mehrmals schon durchgelesen habe, also kenne ich die materie schon gut.
[...] wenn twitch seine api bzw. source code wieder ändern sollte, dann passe ich es auch wieder an.
Ich kann dich nicht ernstnehmen. Du redest von IRC als wäre das eine API, die von Twitch bereitgestellt wird, die sie beliebig ändern könnten. Das ist doch offensichtlicher Blödsinn.
Wenn du "schon die Funktionsweisen von IRC Server 1-2 Tage min via google und co" "abgecheckt" und gelesen hättest, dann wärst du wohl auf den RFC 1459 gestoßen, in dem ganz genau steht, wie IRC funktioniert. Dann wüsstest du auch, dass dein Code nicht funktioniert und dass IRC nichts mit Twitch zu tun hat.
Wenn du nicht als Troll wirken willst, solltest du dich also besser informieren und dir auch etwas mehr Mühe mit deinen Posts geben.
Antworten