![]() |
ClientSocket und IRC
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:
wie lös ich das problem?
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; Mit freundlichen Grüßen Roki |
Re: ClientSocket und IRC
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 |
Re: ClientSocket und IRC
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 |
Re: ClientSocket und IRC
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:
Sowas in der Richtung. Keine Garantie das es auf Anhieb läuft, ist ebend mal so aus'm Hirn gequetscht...
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; 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 |
Re: ClientSocket und IRC
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 :\ |
Re: ClientSocket und IRC
Vielen Dank!
Dein Code klingt ja relativ plausibel :) Ich werde es heut Nachmittag ausprobieren, bin aber zuverlässig, dass es funktioniert... cu Roki |
Re: ClientSocket und IRC
Wenn was nicht klappt kannste mir ruhig ne PM senden, dann helf ich gern weiter =)
|
Re: ClientSocket und IRC
Moin!
Zitat:
MfG Muetze1 |
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:45 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz