Autor Beitrag
PSLenny
Hält's aus hier
Beiträge: 13

Windows 7
Delphi 7
BeitragVerfasst: So 04.07.10 11:59 
Guten Mittag liebe Community :)

Seit Tagen versuche ich einen TCP Client ohne Interface zu schreiben. Allerdings weiß ich nicht wie ich vorgehen soll, da ich zuvor immer nur das TTcpClient Control verwendet habe, und ich mir nicht sicher bin, ob ich dieses auch z.B. bei einer Konsolen Anwendung verweden kann.

Überlegt hatte ich mir folgendes:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
program TCPClient.Console;

{$APPTYPE CONSOLE}

uses
  Windows, SysUtils,
  Dialogs, Sockets;

var
  con: bool = false;
  CSocket: TTcpClient;

begin
  CSocket.RemoteHost := '127.0.0.1';
  CSocket.RemotePort := '7777';
  CSocket.Active := true;
  While (con = false) Do Begin
    If Csocket.Connect() then begin
      con := true;
      WriteLn('Successfully connected');
    end;
  end;
end.


Allerdings gibt es dort nur eine Konsolen Ausgabe: Zugriffsrecht Verletzung Access Violation o.ä (Konjsole blinkt nur auf) und im Debugger steht:
[Warnung] Variable 'CSocket' ist möglicherweise nicht initialisiert worden

Bin ich so wie ich es bis jetzt habe auf dem richtigen Weg, oder brauch ich dafür andere Komponenten? Wie kann ich CSocket initialisieren, oder bin ich auf dem Holzweg?

Vielen Dank im Voraus, und schönen Sonntag noch!

Grüße,
Lenny
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 04.07.10 13:23 
user profile iconPSLenny hat folgendes geschrieben Zum zitierten Posting springen:
Wie kann ich CSocket initialisieren, oder bin ich auf dem Holzweg?
Wie in einer normalen Anwendung auch.
ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
xy := TXy.Create(nil);
try
  xy. ...
finally
  xy.Free;
end;
Du hast bei einer Konsolenanwendung aber keine Botschaftswarteschlange oder ähnliches, dementsprechend kannst du keine Windows Botschaften empfangen usw.

Für diesen Beitrag haben gedankt: PSLenny
PSLenny Threadstarter
Hält's aus hier
Beiträge: 13

Windows 7
Delphi 7
BeitragVerfasst: So 04.07.10 15:15 
Hallo jaenicke und vielen Dank - das hat mir sehr geholfen!

In der Zwischenzeit bin ich auf die Indy Irc Komponente gestoßen - genau das wonach ich gesucht habe! Allerdings war mein Problem ja allgemeingültig - also hat es mir auch hier sehr viel geholfen!

Nun hätte ich zu der Komponente selbst noch ein Problem: Ich kann zu keinem Server connecten, bzw. keinem Channel joinen! Ich weiß nicht ob ich erfolgreich connecte, aber Irc.Connected sagt ja.

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
14:
15:
16:
17:
18:
19:
20:
21:
22:
23:
24:
25:
26:
27:
28:
program Project2;

{$APPTYPE CONSOLE}

uses
  SysUtils, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient,
  IdIRC;

var
  IRC: TIdIrc;

begin
  IRC := TIdIrc.Create(nil);
  try
    IRC.Host := ('clanserver4u.de.quakenet.org');
    IRC.Port := 6667;
    IRC.Username := 'PalimPalim';
    IRC.Nick := 'SupderDuper';
    IRC.AltNick := 'DingDong';
    IRC.Connect();
    Sleep(10000);
    IRC.Join('#UniChat10');
    WriteLn('Joined');
    Sleep(10000);
  finally
    IRC.Free;
  end;
end.


Wenn ich das gleiche Allerdings MIT Gui nachbaue, funktioniert alles Einwandfrei!

Weiß jemand einen Rat, woran kann es liegen?

Vielen Dank im Voraus und viele Grüße,

Lenny
jaenicke
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starofftopic star
Beiträge: 19341
Erhaltene Danke: 1752

W11 x64 (Chrome, Edge)
Delphi 12 Pro, C# (VS 2022), JS/HTML, Java (NB), PHP, Lazarus
BeitragVerfasst: So 04.07.10 16:42 
Das kann durchaus daran liegen, dass in einer Konsolenanwendung eben vieles nicht zur Verfügung steht. Wobei die Indys eigentlich auch so gehen sollten. Ich vermute, dass es an deinem Sleep liegt.

Denn statt darauf zu reagieren, dass du verbunden bist, wartest du einfach 10 Sekunden und frierst in der Zeit das Programm komplett ein. So läuft das eben nicht sinnvoll, selbst wenn du es doch irgendwie so hinzufrickeln schaffst...
Voxe
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 41

Win XP, Win 7
Delphi 7 prof
BeitragVerfasst: Sa 24.07.10 15:28 
Hallo, vielleicht kann ich da mal helfen.

Warum eine Konsolenanwendung ??? Schreibe eine normale GUI-Anwendung, mit allen Funktionen. Stelle im Projekt, ShowMainForm auf false. Du hast alle Funktionen und kein direkt sichtbares Programm.

Gruß
Niko S.
ontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic starofftopic star
Beiträge: 566
Erhaltene Danke: 10

Win 7, Ubuntu
Lazarus, Turbo Delphi, Delphu 7 PE
BeitragVerfasst: Sa 24.07.10 18:54 
Probier einfach anstatt zu warten einfach das.
ausblenden Delphi-Quelltext
1:
2:
3:
repeat
  readln(aCmd); //aCmd = String
until aCmd = 'quit';

Dann musst du erst "quit" eingeben bevor sich das Programm beendet.