AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Netzwerke Delphi ClientSocket und IRC
Thema durchsuchen
Ansicht
Themen-Optionen

ClientSocket und IRC

Ein Thema von Roki_ · begonnen am 13. Mär 2005 · letzter Beitrag vom 14. Mär 2005
Antwort Antwort
Roki_

Registriert seit: 6. Mär 2005
12 Beiträge
 
Delphi 7 Enterprise
 
#1

ClientSocket und IRC

  Alt 13. Mär 2005, 22:18
Hallo,

ich bin gerade dabei eine Bouncer Control zu schreiben, ist also zuvergleichen mit einem IRC-Client.
Zum Kommunizieren wird ClientSocket verwendet.

Nun ist das problem beim OnRead bekomm ich mehr als eine Zeile gesendet, d.H. wenn 2 Join events in einem ankommenden String sind, dann phrase ich nur den 1. Channel raus...

Delphi-Quellcode:
if pos('JOIN', sData) <> 0 then
begin
 delete(sData,1,pos('JOIN', sData)+5);
 chan := copy(sData,1,pos(#$D,sData)-1);
 Listbox1.Items.add(chan);
end;
wie lös ich das problem?

Mit freundlichen Grüßen
Roki
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#2

Re: ClientSocket und IRC

  Alt 13. Mär 2005, 22:54
Moin!

Nach jedem JOIN kommt ein LF, oder? Warum weist du nicht einfach den empfangenen String einer TStringList.Text zu und untersuchst dann nacheinander ihre Items[]...??

MfG
Muetze1
  Mit Zitat antworten Zitat
Roki_

Registriert seit: 6. Mär 2005
12 Beiträge
 
Delphi 7 Enterprise
 
#3

Re: ClientSocket und IRC

  Alt 13. Mär 2005, 23:06
weil ich damit noch nicht gearbeitet habe und nich weiss, was es ist
ich schau, dass ich mich schlau mache..

und was ist ein LF? - CRLF? Ja!

//€
Also ich bekomms mit Stringlist nicht so recht hin.. wie hättest du es dir denn vorgestellt?

cu Roki
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#4

Re: ClientSocket und IRC

  Alt 14. Mär 2005, 03:05
Moin!

CR = Carriage Return - also Cursor zurück zum Anfang der Zeile
LF = Line Feed - also eine Zeile vorrücken.

Zusammen ergibt das dann einen Zeilenvorschub und der Cursor steht in dieser neuen Zeile ganz links...

Und wie ich es mir vorstelle:

Delphi-Quellcode:
Procedure ClientsocketRead...
Var
  lSL : TStrings;
  i : Integer;
  lData : String;
Begin
  lSL := TStringList.Create;
  Try
    lSL.Text := Socket.ReceiveText; // die StringList teilt das auf in die Zeilen
    
    For i := 0 To lSL.Count-1 Do // nun die Zeilen nacheinander durchgehen und jeweils drum kümmern...
    Begin
      lData := lSL[i];

      If ( Pos('JOIN', lData) > 0 ) Then
      Begin
        Delete(lData, 1, Pos('JOIN', lData)+5);
        ListBox1.Items.Add(lData); // Chan unnötig, da nach dem Delete() lData nur noch den Chan enthalten kann...
      End;
    End;
  Finally
    lSL.Free;
  End;
End;
Sowas in der Richtung. Keine Garantie das es auf Anhieb läuft, ist ebend mal so aus'm Hirn gequetscht...

Wichtig! ReceiveText() des Socket gibt keine Sicherheit das immer komplette Zeilen ankommen! Es ist sehr gut möglich das dein OnClientRead mehrfach aufgerufen wird, bevor du überhaupt eine komplette Zeile empfangen hast. Es kann also gut sein, das du ein "JOIN" empfängst, aber der Channelname der dahinter kommt, den bekommste erst beim nächsten Aufruf von OnClientRead! Darauf will ich noch hinweisen...

MfG
Muetze1
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#5

Re: ClientSocket und IRC

  Alt 14. Mär 2005, 03:27
du könntest das ganze auch parsen...
erstmal ersetzt du alle #13 durch #10 in deinem string, dann löscht du doppelte #10er (sofern vorhanden, nicht alle server senden beides) und dann führst du den string in einer schleife aus, bis dieser leer ist...das ganze sieht dann ca so aus:

command1#10command2#10command3#10command4#10...

also kopierst du bis #10 -1 und löscht bis #10.

so ca:

Delphi-Quellcode:
    { Alle #13er durch #10er ersetzen und doppelte #10er löschen(sofern vorhanden). }
    ConArray[i].Queue := ConArray[i].Queue + ReceiveText;
    while pos(#13, ConArray[i].Queue) <> 0 do
      ConArray[i].Queue[pos(#13, ConArray[i].Queue)] := #10;
    while pos(#10#10, ConArray[i].Queue) <> 0 do
      delete(ConArray[i].Queue, pos(#10#10, ConArray[i].Queue), 1);
    { Alle Befehle aus der Queue verarbeiten }
    while pos(#10, ConArray[i].Queue) <> 0 do
    begin
      case IdxArrStr(CommandArray, GetTok(s, 1, #32)) of
        0: {JOIN}
          begin
            // Do Something
          end;
        1: {PART}
          begin
          end;
      end;
      Delete(ConArray[i].Queue, pos(#10, ConArray[i].Queue));
    end;

Hab damals viel mit irc gemacht =)

BTW: ich finds gut das du keine fertige kompos nimmst, sowas sieht man hier leider selten :\
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Roki_

Registriert seit: 6. Mär 2005
12 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: ClientSocket und IRC

  Alt 14. Mär 2005, 12:40
Vielen Dank!

Dein Code klingt ja relativ plausibel

Ich werde es heut Nachmittag ausprobieren, bin aber zuverlässig, dass es funktioniert...


cu Roki
  Mit Zitat antworten Zitat
Benutzerbild von Pseudemys Nelsoni
Pseudemys Nelsoni

Registriert seit: 24. Dez 2002
Ort: Hamburg-Harburg
3.551 Beiträge
 
#7

Re: ClientSocket und IRC

  Alt 14. Mär 2005, 12:46
Wenn was nicht klappt kannste mir ruhig ne PM senden, dann helf ich gern weiter =)
Mario
MSN: cyanide@ccode.de
  Mit Zitat antworten Zitat
Muetze1
(Gast)

n/a Beiträge
 
#8

Re: ClientSocket und IRC

  Alt 14. Mär 2005, 14:42
Moin!

Zitat von Roki_:
Vielen Dank!

Dein Code klingt ja relativ plausibel

Ich werde es heut Nachmittag ausprobieren, bin aber zuverlässig, dass es funktioniert...


cu Roki
Nur das die TStringList das automatisch macht und kein Problem mit den $13, $10 bzw. $10, $13 oder nur $13 hat. Daher ist es eine Frage wie kompliziert man es sich machen will ...

MfG
Muetze1
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 02:48 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz