WinFuture-Forum.de: Kann Nicht Mit Tidirc Verbinden - WinFuture-Forum.de

Zum Inhalt wechseln

Nachrichten zum Thema: Entwicklung
Seite 1 von 1

Kann Nicht Mit Tidirc Verbinden Nur erste Zeile wird ausgegeben


#1 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 10. September 2005 - 10:53

Moin, Moin.

Ich habe ein Problem mit der Indy-Komponente TIdIRC. Undzwar setzte ich alle Eigenschaften wie Benutzernamen usw. und verbinde, TIdIRC aber gibt nur die erste Antwort des Server aus und bleibt dann stehen. Die AMessages im Event OnRaw sind die folgenden:

Zitat

-> NICK PelzigesWaldtier
-> USER PelzigesWaldtier 0 * :Mein echter Name
<- NOTICE AUTH :*** Looking up your hostname...


Der Pfeil stellt AIn dar. Danach tut sich gar nichts mehr. Der IRC-Server registriert keine Verbindung. Weiss jemand, woran das liegen könnte?

Grüße und vielen Dank im Vorraus,
PelzigesWaldtier

Dieser Beitrag wurde von PelzigesWaldtier bearbeitet: 10. September 2005 - 10:54

0

Anzeige



#2 Mitglied ist offline   tavoc 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.437
  • Beigetreten: 22. Juli 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 18. September 2005 - 17:47

Hi,

ich habe auch mal probiert mit den Indys was zu basteln, meiner Erfahrung nach sind die 9er und 10 er IRC Komponenten fehlerhaft.

Ich habe deshalb selber etwas mit winsockets geschrieben, das ist einfacher und man lernt mehr,da man dort alles selber machen kann/muss.
your IP is 127.0.0.1 or ::1
you are running an OS
you use a Browser
I know so much about you...
0

#3 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 19. September 2005 - 17:29

Also liegt es nicht an mir, gut. :)

Dann werde ich mich mal sehen wie weit ich "per Hand" komme. Vielen Dank.

PW
0

#4 Mitglied ist offline   tavoc 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.437
  • Beigetreten: 22. Juli 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 19. September 2005 - 18:08

Wenn du es mit den Sockets machst geht das so:

  ClientSocket1.Host:=ServerIrc;
  ClientSocket1.Port:=PortIrc;
  ClientSocket1.Open;
  ClientSocket1.Socket.SendText('Pass '+PasswordIrc+#13#10);    
  ClientSocket1.Socket.SendText('User '+UserIrc+' HostName '+ServerIrc+' :RealName' + #13#10);
  ClientSocket1.Socket.SendText('Nick '+NickIrc+#13#10);
  ClientSocket1.Socket.SendText('Join '+ChannelIrc+#13#10);


die daten die ankommen siehst du so

procedure TMainForm.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var empfangen: string;
begin
  empfangen := ClientSocket1.Socket.ReceiveText;
....
end;


Natürlich musst du dir dann noch einen Parser bauen der die ganzen Befehle entgegennimmt sowie ein Fensterhandling.

Dieser Beitrag wurde von tavoc bearbeitet: 19. September 2005 - 18:09

your IP is 127.0.0.1 or ::1
you are running an OS
you use a Browser
I know so much about you...
0

#5 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 19. September 2005 - 20:32

Herlichen Dank. Genau das brauchte ich auch nur. Jetzt kann ich ja selber rumbasteln. Ich möchte meinen pBot nämlich auf Delphi umsetzen. :wink:

PW
0

#6 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 21. September 2005 - 18:22

Das konnte ich alles bereits umsetzen und es scheint sehr gut zu klappen. Nur habe ich jetzt ein Problem: Ich kann zwar auf das OnReceive-Ereignis reagieren, nur muss ich erst ClientSocket1.ReceiveLn() aufrufen, damit überhaupt versucht wird eine Antwort zu lesen.

Wie kann ich es schaffen, dass die Antworten des Servers automatisch empfangen werden? Weißt du da was?

PW

Nachtrag:
Ich hoffe ihr verzeiht mir den ungewollten Doppelpost.

Dieser Beitrag wurde von PelzigesWaldtier bearbeitet: 21. September 2005 - 18:23

0

#7 Mitglied ist offline   tavoc 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.437
  • Beigetreten: 22. Juli 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 21. September 2005 - 19:06

Ich empfange Nachrichten vom Server so.


procedure TMainForm.ClientSocket1Read(Sender: TObject;
Socket: TCustomWinSocket);
var empfangen: string;
begin
TIrcForm(WindowIrc('Status'+ServerIrc, '', 'status')).REChannelIrc.Lines.Add(''); ->eigene funktion die das ganze Zeug ins Statusfenster schreibt
colorIrc(empfangen, TextColorIrc, TIrcForm(WindowIrc('Status'+ServerIrc, '', 'status')).REChannelIrc);
empfangen := ClientSocket1.Socket.ReceiveText; ->was ankommt wird der variable empfangen zugewiesen
while pos(#$D#$A, empfangen)>0 do
begin
receive(copy(empfangen,1,pos(#$D#$A, empfangen)));
delete(empfangen,1,pos(#$D#$A, empfangen));
end;
receive(empfangen); ->die strings in der VAR empfangen werden zeilenweise analysiert, das passiert in meiner receive funktion, dann wird dieser teil gelöscht und die nächste zeile kommt ran
end;


Ich hoffe das löst dein Problem.


Btw. wie kann ich per button [code] wieder reinmachen? Im [code] gehen dann auch keine Farben.
your IP is 127.0.0.1 or ::1
you are running an OS
you use a Browser
I know so much about you...
0

#8 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 21. September 2005 - 21:27

Das habe ich so auch schon teilweise herausgefunden. Komischerweise ist es aber so, dass ich, um überhaupt Zeilen vom Sever empfangen zu können ReceiveLn() aufrufen muss. Ohne diesen Aufruf wird auch das Ereignis OnRead nicht ausgelöst.

Hier anschaulich:

  // Dialog zeigen
  Form2.ShowModal;

  // Werte übertagen
  conn.RemoteHost := Form2.cmbserver.Text;
  conn.RemotePort := Form2.cmbport.Text;

  // Verbindung aufbauen
  conn.Connect;

  if conn.Connected = true then
	begin
	  // Benutzerdaten senden
	  conn.Sendln('NICK dBot');
	  conn.Sendln('USER dBot 0 * :dBot');
	  conn.Receiveln();
	end;


Das conn.ReceiveLn(); lässt mein Programm die nächste Antwort empfangen und erst dann kann das OnRead-Ereignis erst ausgelöst werden. Wenn keine neue Antwort vorhanden ist, dann bleibt das Programm hängen. Wenn ich conn.ReceiveLn(); ganz weglasse, dann wird gar nichts empfangen.

PW

Dieser Beitrag wurde von PelzigesWaldtier bearbeitet: 21. September 2005 - 21:28

0

#9 Mitglied ist offline   tavoc 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.437
  • Beigetreten: 22. Juli 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 22. September 2005 - 07:05

Erstmal muss ich fragen welche Socketkomponente du in Delphi eigebunden hast.
Bei Delphi 2005 ist nämlich die dclsockets90.bpl nicht installiert, die musst du erst nachräglich hinzufügen.

Warum es bei dir nicht geht weiß ich grade nicht, ich schreibe einfach mal was ich habe.

function TMainForm.connect():boolean;
begin
  ClientSocket1.Host:=ServerIrc;
  ClientSocket1.Port:=PortIrc;
  ClientSocket1.Open;
end;


procedure TMainForm.ClientSocket1Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
  TIrcForm(WindowIrc('Status'+ServerIrc, '', 'status')).Hide;
  ClientSocket1.Socket.SendText('Pass '+PasswordIrc+#13#10);   
  ClientSocket1.Socket.SendText('User '+UserIrc+' HostName '+ServerIrc+' :RealName' + #13#10);
  ClientSocket1.Socket.SendText('Nick '+NickIrc+#13#10);
  ClientSocket1.Socket.SendText('Join '+ChannelIrc+#13#10);
  WindowIrc(ChannelIrc, '', 'channel');
end;

Das ist das connecten zum Server, WindowIRC ruft ein weiteres Fenster auf->Channelfenster(eigene funktion).

Zuerst wird per button die funktion connect aufgerufen, damit entsteht die verbindung zum server, wenn die komponente mitbekommt das sie verbunden ist wird das ONconnect ereignis ausgelöst-> die prozedur, womit ich in einen channel komme.


procedure TMainForm.ClientSocket1Read(Sender: TObject;
  Socket: TCustomWinSocket);
var empfangen: string;
begin
  TIrcForm(WindowIrc('Status'+ServerIrc, '', 'status')).REChannelIrc.Lines.Add('');
  colorIrc(empfangen, TextColorIrc, TIrcForm(WindowIrc('Status'+ServerIrc, '', 'status')).REChannelIrc);
  empfangen := ClientSocket1.Socket.ReceiveText;
  while pos(#$D#$A, empfangen)>0 do
  begin
	receive(copy(empfangen,1,pos(#$D#$A, empfangen)));
	delete(empfangen,1,pos(#$D#$A, empfangen));
  end;
  receive(empfangen);
end;

Diese Prozedur ist das ONRead Ereignis,
und das ist das gesamte empfangen, mehr ereignisse frage ich nicht ab.


Evtl hast du eine andere socketkomponente wo das ganze anders funktioniert.

Dieser Beitrag wurde von tavoc bearbeitet: 22. September 2005 - 07:06

your IP is 127.0.0.1 or ::1
you are running an OS
you use a Browser
I know so much about you...
0

#10 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 22. September 2005 - 14:54

Ich habe die TTcpClient-Komponente verwendet. Daran wird es sicherlich gelegen haben. Ich versuche es jetzt mal mit der TClientSocket-Komponente. Danke für den Hinweis. ;)

PW
0

#11 Mitglied ist offline   tavoc 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.437
  • Beigetreten: 22. Juli 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 22. September 2005 - 15:02

Die dclsockets90.bpl befindet sich übrigens schon im Delphi ordner, bei "bin".
your IP is 127.0.0.1 or ::1
you are running an OS
you use a Browser
I know so much about you...
0

#12 _PelzigesWaldtier_

  • Gruppe: Gäste

geschrieben 22. September 2005 - 20:53

Jetzt klappt es wunderbar. Naja, fast: Vom IRC-Server wird immer nur das folgende gesendet:

Zitat

[21:49:46] {Socket} Verbindung hergestellt.
[21:49:46] {Client} USER dBot
[21:49:46] {Client} NICK dBot 0 * :dBot
[21:49:46] {Server} :irc.localhost NOTICE AUTH :*** Looking up your hostname...
[21:49:46] {Server} :irc.localhost NOTICE AUTH :*** Found your hostname


Danach steht die Verbindung still und erreicht dann auch bald das Timeout. Das typische "-irc.localhost- *** If you are having problems connecting due to ping timeouts, please type /quote pong FEA6BC14 or /raw pong FEA6BC14 now." fehlt leider. Das heisst, dass es nicht daran liegen kann, dass ich keine PONGs sende. Denn dazu wurde ich ja noch gar nicht aufgefortert.

Weisst du vielleicht woran das liegen könnte? (Man, man, PHP ist einfacher ;) )

Grüße und vielen Dank für deine Hilfe schon soweit,
PelzigesWaldtier
0

#13 Mitglied ist offline   tavoc 

  • Gruppe: aktive Mitglieder
  • Beiträge: 3.437
  • Beigetreten: 22. Juli 04
  • Reputation: 1
  • Geschlecht:Männlich

geschrieben 22. September 2005 - 21:05

Hm wenn du es so gemacht hast wie ich weiß ich nicht warum es nicht klappt, wenn du willst schick ihr dir mein source komplett und du kannst nachgucken was du halt brauchst, ist zwar nicht die endversion, aber das verbinden und senden geht dort, nur das fensterhandling darfst du dir nicht angucken, das ist leider müll ;) .
your IP is 127.0.0.1 or ::1
you are running an OS
you use a Browser
I know so much about you...
0

Thema verteilen:


Seite 1 von 1

1 Besucher lesen dieses Thema
Mitglieder: 0, Gäste: 1, unsichtbare Mitglieder: 0