TCPconnect neuverbinden wenn die verbindung einmal getrennt wurde?

  • Für meinen selber geschriebenen BNC such ich ne Funktion das der BNC wenn die Verbindung mal abbricht zum IRC server er sich selber neu verbindet.
    Das selbe Problem hab ich bei TCPListen das er wenn ich mich einmal verbunden habe mich nicht nochmal verbinden kann ohne das script neu zu starten.

    Ich komm gerade nicht weiter wie ich das Problem lösen könnte.^^

    [autoit]

    #include <irc.au3>

    $server = IniRead(@ScriptDir & "/BNC.ini", "Login", "Server", "multiplay.uk.quakenet.org")
    $channel = IniRead(@ScriptDir & "/BNC.ini", "Login", "Channel", "#testchann")
    $nick = IniRead(@ScriptDir & "/BNC.ini", "Login", "Nick", "testnick_123")
    $port = IniRead(@ScriptDir & "/BNC.ini", "Login", "Port", "6667")
    $master = IniRead(@ScriptDir & "/BNC.ini", "Master", "Master", "hotwert")
    $passwort = IniRead(@ScriptDir & "/BNC.ini", "Master", "Passwort", "test")


    TCPStartup()

    Global $sock = _IRCconnect($server, $port, $nick)
    $recv = TCPRecv($sock, 8192)
    ;If not $recv= "" then MsgBox(0,"",$recv)
    $sData = StringSplit($recv, @CRLF)
    For $i = 1 To $sData[0] Step 1
    $sTemp = StringSplit($sData[$i], " ")
    If $sTemp[0] >= 2 Then
    If $sTemp[1] = "PING" Then _IRCPing($sock, $sTemp[2])
    EndIf
    Next

    [/autoit][autoit][/autoit][autoit][/autoit][autoit][/autoit][autoit]

    $bncsock = TCPListen("127.0.0.1", 1234)
    Do
    $ConnectedSocket = TCPAccept($bncsock)
    Until $ConnectedSocket <> -1
    sleep(1000)
    Tcpsend($ConnectedSocket, "PING :123456789" & @CRLF)
    TCPSend($ConnectedSocket, ":Hotwert!~[email='Hotwert@mein.host.de'][/email] PRIVMSG test :hallo" & @CRLF)
    TCPSend($ConnectedSocket, ":Hotwert.irc.bnc 001 hotwert :Welcome to the Hotwert IRC Network." & @CRLF)
    TCPSend($ConnectedSocket, ":Hotwert.irc.bnc NOTICE Hotwert :on 2 ca 1(4) ft 20(20) tr" & @CRLF)
    TCPSend($ConnectedSocket, ":Hotwert.irc.bnc 221 hotwert +i" & @CRLF)
    TCPSend($ConnectedSocket, ":Hotwert!~[email='Hotwert@mein.host.de'][/email] MODE Hotwert +i" & @CRLF)
    sleep(1000)
    Tcpsend($ConnectedSocket, ":Hotwert.irc.bnc 311 hotwert hotwert ~hotwert mir.is.langweilig * :lalalala" & @CRLF)
    Tcpsend($ConnectedSocket, ":Hotwert.irc.bnc 319 hotwert hotwert :@#channel1 @#channel2 @#hotwert" & @CRLF)
    Tcpsend($ConnectedSocket, ":Hotwert.irc.bnc 312 hotwert hotwert *.ficken.org :fick IRCServer" & @CRLF)
    Tcpsend($ConnectedSocket, ":Hotwert.irc.bnc 330 hotwert hotwert hotwert :is authed as" & @CRLF)
    Tcpsend($ConnectedSocket, ":Hotwert.irc.bnc 318 hotwert hotwert :End of /WHOIS list." & @CRLF)
    While 1
    $test = TCPRecv($ConnectedSocket,8192)
    $recv = TCPRecv($sock, 8192)
    ;If not $recv= "" then MsgBox(0,"",$recv)
    If $ConnectedSocket = @error then
    TCPCloseSocket($ConnectedSocket)
    $ConnectedSocket = TCPAccept($bncsock)
    endif

    $sData = StringSplit($recv, @CRLF)
    For $i = 1 To $sData[0] Step 1
    $sTemp = StringSplit($sData[$i], " ")
    If $sTemp[0] >= 2 Then
    If $sTemp[1] = "PING" Then _IRCPing($sock, $sTemp[2])
    EndIf
    Next
    If not $recv = "" then Tcpsend($ConnectedSocket, $recv)
    If not $test = "" then TCPSend($sock, $test)

    ;If $test = "test" then TCPSend($ConnectedSocket, "hallo" & @CRLF)
    sleep(500)
    WEnd

    [/autoit]

    Das Script läuft einwandfrei und macht auch das was es machen soll! Es besteht nur noch das oben beschriebene Problem.

    Einmal editiert, zuletzt von hotwert (9. Januar 2010 um 12:51)

  • Kann man nicht den Status der Verbindung überprüfen?
    Die Notlösung wäre, dass du dich immer mal wieder mit dem IRC-Server verbindest.

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • such mal die TCP UDF

    da gibts ein event wenn ein Client disconnect dass eine Funktion aufgerufen wird...

  • Ich würde die _IRCSendMessage Funktion nehmen. Am besten in der While Schleife.

    Spoiler anzeigen

    Grundkenntnisse in: C++, JavaScript
    Sehr gute Kenntnisse: PHP, JAVA, C und näturlich AutoIt


    Klaviatur, Anhang UDF, GDI+ Mühle

    Zitat

    "Wenn einen um 20h der Pizzadienst anruft und fragt, ob man's nur vergessen hat und ob man das gleiche
    möchte wie immer -- dann sollte man sein Bestellverhalten evtl überdenken"

  • Ich würde die _IRCSendMessage Funktion nehmen. Am besten in der While Schleife.

    höh? naja egal^^

    Es funzt nun mit der tcp.au3 das ich mich verbinden kann mit den script ohne das ich das script jedesmal neustarten muss.
    Wenn ich mich neuverbinde mit den BNC sehe ich allerdings nicht mehr in welchen channel ich bin und wenn ich den channl neu joine sehe ich die member dort nicht.
    Gibts im IRC ne Funktion um die Userlist im channel abzurufen damit ich diese vom BNC an mein IRC prog senden kann?

    • Offizieller Beitrag

    Gibts im IRC ne Funktion um die Userlist im channel abzurufen damit ich diese vom BNC an mein IRC prog senden kann?


    Gibt es: /WHO kanal
    Kann aber sein, dass das nicht mit allen Clients funktioniert.
    Probier mal (ungetestet):

    [autoit]

    Func _IRCListUser ($irc, $chan)
    If $irc = -1 Then Return 0
    TCPSend($irc, "WHO " & $chan & @CRLF)
    If @error Then
    MsgBox(1, "IRC.au3", "Server has disconnected.")
    Return -1
    EndIf
    Return 1
    EndFunc

    [/autoit]


    Die Listung erfolgt dann im im TCPRecv. Dort mußt du es rausfiltern.

    Kannst dir ja auch mal das ansehen - vielleicht kannst du davon was verwenden.

  • mit WHO bekam ich die einzelnen user aufgelistet und mein irc programm konnte damit nix anfangen.

    Allerdings gibt NAMES #channel und das funzt. Mit NAMES #channel bekomm ich die selbe liste wie wenn ich den channel joine und muss nicht erst alles einzeln einlesen. Wenn ich den Befehl eingebe aktuallisiert sich die liste von meinen irc prog auch automatisch.

  • Derzeit hab ich das problem mit den Channels und den befehl für jeden Channel zu senden.
    Also die channel bekomm ich raus indem ich "WHOIS " & $nick sende.

    Nur wie bring ich AutoIt dazu alle gefundenen Channel in verschiedenen variablen zu speichern also $variable[1] und $variable[2] ???
    Die Channel auslesen wäre recht einfach nur was mach ich wenn mal mehr wie 1 Channel dasteht wie mach ich das? Es ist ja nicht bekannt wieviel Channel is werden.

    Und wie mach ich dann das er alle gefunden Channels mit "NAMES " & $variable[1] usw. an den IRC server sendet?

    Ich hab gerade kein Plan wie ich das lösen könnte.

    Pls help