Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi irc + clientsocket (https://www.delphipraxis.net/69512-irc-clientsocket.html)

mr.unbekannt 16. Mai 2006 11:43


irc + clientsocket
 
Hi@all!

ich wollte mal probieren wie man mittels des clientsocket an einen irc-server verbindet und auch daten von ihm bekommt, bzw sendet ( auch privat message) nur ich weiß nicht wie ich das machen soll! bei mir geht der nur bis connected! kann mir da jmd helfen?

danke für jede antwort!

sECuRE 16. Mai 2006 12:00

Re: irc + clientsocket
 
Hi,

ein guter Start ist sicher mal, sich das RFC durchzulesen, da steht eigentlich alles drin, was du wissen musst (im das IRC-Protokoll umzusetzen).

Prinzipiell sendet der Client am anfang seinen USER- und NICKname:
USER <username> <hostname> <servername> :<realname>
NICK <nickname>

Anschließend sendet der Server für gewöhnlich eine NOTICE, auf jeden Fall aber ein PING <irgendwas>, auf das du mit PONG <irgendwas> (wobei <irgendwas> das selbe sein muss) antworten musst. Alles weitere ist dann spezifisch...

cu

BTW: Das RFC findest du auf http://www.faqs.org/rfcs/rfc1459.html

mr.unbekannt 16. Mai 2006 12:03

Re: irc + clientsocket
 
das rfc habe ichmir shcon mal angeguckt, nur bin net draus schlau geworden! aber ich gucke mal nach dem was du mir da geschrieben hast!

danke noch!

sECuRE 16. Mai 2006 12:07

Re: irc + clientsocket
 
Hi,

das RFC beschreibt halt das komplette Protokoll, das ist vielleicht nicht gerade benutzerfreundlich, aber nunja... Ist eben eines der Dinge, mit denen man sich herumschlagen muss, wenn man für ein bestimmtes Protokoll Software schreibt ;).

Du kannst das ganze ja mal mithilfe von Telnet simulieren: Windowstaste+R drücken, "telnet <IRCserver> 6667" eingeben und dann die von mir erwähnten zeilen schicken...

cu

mr.unbekannt 16. Mai 2006 12:10

Re: irc + clientsocket
 
hättest du da vllt mal nen beispiel? weil das was ich habe funktioniert nicht!
Delphi-Quellcode:
memo1.Lines.Add('connect');
clientsocket1.Socket.SendText('USER <top10> <addy> <irc.knuddelknutscher.biz> :<realname>');
clientsocket1.Socket.SendText('NICK <top10>');

sECuRE 16. Mai 2006 12:16

Re: irc + clientsocket
 
Hi,

Zitat:

Zitat von mr.unbekannt
hättest du da vllt mal nen beispiel? weil das was ich habe funktioniert nicht!
Delphi-Quellcode:
memo1.Lines.Add('connect');
clientsocket1.Socket.SendText('USER <top10> <addy> <irc.knuddelknutscher.biz> :<realname>');
clientsocket1.Socket.SendText('NICK <top10>');

Der Ansatz ist schon richtig... Allerdings dienten die <> nur dazu, auszudrücken, dass hier etwas zu ersetzendes steht. Außerdem schließt man (nicht nur im IRC) Zeilen mit #13#10 (CRLF) ab. Quelltext:
Delphi-Quellcode:
ClientSocket1.Socket.SendText('USER top10 addy irc.knuddelknutscher.biz :Echter Name'+#13#10);
ClientSocket1.Socket.SendText('NICK top10'+#13#10);
Eine Anmerkung noch: Bei dem dritten Parameter von USER, also dem Hostname, ist es besser, den Hostname zu benutzen, zu dem ClientSocket1 wirklich verbunden ist - das muss nicht unbedingt der angegebene in ClientSocket1.Host sein, schließlich gibt es im DNS auch Weiterleitungen...

cu

mr.unbekannt 16. Mai 2006 12:19

Re: irc + clientsocket
 
und noch ne frage:
ich habe:
Delphi-Quellcode:
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
begin
memo1.Lines.Add(socket.ReceiveText);
end;

procedure TForm1.ClientSocket1Write(Sender: TObject;
  Socket: TCustomWinSocket);
begin
memo1.Lines.Add(socket.ReceiveText)
end;
und bekomme keien daten ins memofeld außer das was das programm ausgibt, also
Delphi-Quellcode:
memo1.Lines.Add('connect');
wieso?

mr.unbekannt 16. Mai 2006 12:22

Re: irc + clientsocket
 
so, nachdem ich das so gemahct habe wie du es gesgat hast bekam ich auch daten1 danke erstmal! weißt du vllt noch die befehle für privatmessage senden und empfangen, joinen und nachrichten im chan empfangen und senden?

mr.unbekannt 16. Mai 2006 12:29

Re: irc + clientsocket
 
wieder mal ich!

habe das mit ping udn pong probiert.
Delphi-Quellcode:
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var  text:string;
begin
memo1.Lines.Add(socket.ReceiveText);
if copy(socket.ReceiveText,1,4)='PING' then begin
text:=socket.ReceiveText;
delete(text,1,pos(':',text));
ClientSocket1.Socket.SendText('PONG :'+text+#13#10);
memo1.Lines.Add('PONG :'+text+#13#10);
end;

end;
der sendet aber kein pong!

sECuRE 16. Mai 2006 12:44

Re: irc + clientsocket
 
Hi,

Zitat:

Zitat von mr.unbekannt
wieder mal ich!

habe das mit ping udn pong probiert.
Delphi-Quellcode:
procedure TForm1.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var  text:string;
begin
memo1.Lines.Add(socket.ReceiveText);
if copy(socket.ReceiveText,1,4)='PING' then begin
text:=socket.ReceiveText;
delete(text,1,pos(':',text));
ClientSocket1.Socket.SendText('PONG :'+text+#13#10);
memo1.Lines.Add('PONG :'+text+#13#10);
end;

end;
der sendet aber kein pong!

Bist du sicher, dass er das nicht sendet? Du bekommst vom Server darauf keine Antwort, sondern er "lässt dich dann rein".

Außerdem sendest du was falsches: Du empfängst dreimal Text (Zugriff auf socket.Receivetext), aber die Nachricht ist ja in einem Stück... Also so müsste es aussehen:
Delphi-Quellcode:
var text:string;
begin
text:=socket.ReceiveText;
Memo1.Lines.Add('Empfangen: "'+text+'"');
if (lowercase(copy(text,1,4)) = 'ping') then begin
  // Hab die Parameter von delete() nicht ganz im Kopf, aber müsste es nicht Pos(':',text)+1 sein, wenn du nachher nochmal : vornedranstellst?
  Delete(text,1,Pos(':',text)+1);
  socket.SendText('PONG :'+text+#13#10);
  Memo1.Lines.Add('Gesendet: PONG :'+text+#13#10);
end;
end;
cu

mr.unbekannt 16. Mai 2006 13:10

Re: irc + clientsocket
 
ich glaube das +1 is das was mir fehlt, na mal gucken!

mr.unbekannt 16. Mai 2006 13:29

Re: irc + clientsocket
 
soweit ist jetzt alles okay! der ist verbunden und empfägt nachrichten! nur wie sende ich nachrichten und wie joine ich einen raum?

sECuRE 16. Mai 2006 13:54

Re: irc + clientsocket
 
Hi,

die Edit-Funktion kennst du, oder?

Joinen mit "JOIN #raum", wer hätt's gedacht? ;) Nachrichten werden per PRIVMSG versendet (siehe RFC).

cu

mr.unbekannt 16. Mai 2006 15:18

Re: irc + clientsocket
 
der rest ist jetzt einfach! nur wie kann man sonderzeichen ausgeben? weil wenn ich den doppelpunkt sende sagt der es geht net ich dachte da an sowas wie #58 oder was es war, aber das geht auch net!

sECuRE 16. Mai 2006 15:20

Re: irc + clientsocket
 
Hi,

was genau geht nicht? Doppelpunkte senden geht normalerweise ohne Probleme. Bedenke, dass du bei einer PRIVMSG mit mehreren Wörtern ohnehin einen Doppelpunkt vornedran hast... Zeig mal den Quelltext, der nicht funktioniert.

cu

mr.unbekannt 16. Mai 2006 16:40

Re: irc + clientsocket
 
also der quelltext lautet
Delphi-Quellcode:
clientsocket1.Socket.SendText('PRIVMSG '+wer+' :Platz 1: '+songwoche[1].name+' ('+inttostr(songwoche[1].anzahl)+')'+#13#10)
wenn jetzt songwoche[1].name leer ist geht es! ansonsten wenn es net leer ist, zeigt er die anzahl udn die klammern darum nicht an!

sECuRE 16. Mai 2006 17:00

Re: irc + clientsocket
 
Hi,

hmm, kann ich mir so gar nicht vorstellen eigentlich... Vielleicht sind in "wer" noch zusätzliche Spaces am Ende? Lass dir doch mal den String komplett zusammenbasteln und dann ausgeben, das sollte helfen.

cu

mr.unbekannt 16. Mai 2006 17:40

Re: irc + clientsocket
 
der bot zeigt: "Platz 1: Led Zeppelin - Whole Lotta Love" obwohl er "Platz 1: Led Zeppelin - Whole Lotta Love (1)" zeigen sollte, wo das vorne leer is zeigt er: "(0)"

sECuRE 16. Mai 2006 20:26

Re: irc + clientsocket
 
Hi,

Ich vermute, dass das eher an deiner Datenstruktur oder deren Inhalt liegt, als am Senden. Wie gesagt, schau dir doch im Debugger mal den Inhalt der Variablen an.

cu


Alle Zeitangaben in WEZ +1. Es ist jetzt 09:36 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