Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi automatisches verbinden eines konsolen-winsockclients (https://www.delphipraxis.net/132826-automatisches-verbinden-eines-konsolen-winsockclients.html)

ToXiC 20. Apr 2009 16:46


automatisches verbinden eines konsolen-winsockclients
 
hallöchen
ich bastel momentan an einem programm, dass falls der dazugehörige server online ist nachrichten oder ggf updates herunterläd
da die beiden programme unabhängig von einander läufen sollen möchte ich in den client einen verbindungstimer einbauen, was in einer konsole bereits die erste hürde darstellte.

nachdem ich diesen mit hilfe von dp mit hilfe von threads zum laufen bekam entstand das nächste problem.
das schlimmste ist,dass ich es noch nichtmal genau beschreiben kann.
am besten schaut ihr es euch einfach mal an.
übrigens benutze ich eine litesocket-komponete.

Delphi-Quellcode:
program Project1;

{$APPTYPE CONSOLE}

uses
  Windows,Sockets;
type
TConnection = class
procedure Read(Sender: TObject; Socket: TCustomWinSocket);
procedure Disconnect(Sender: TObject; Socket: TCustomWinSocket);
procedure Error(Sender: TObject; Socket: TCustomWinSocket; ErrorEvent: TErrorEvent; var ErrorCode: Integer);
procedure Connect(Sender: TObject; Socket: TCustomWinSocket);
end;

var
Connection: TConnection;
ClientSocket: TClientSocket;
Msg: TMsg;
ThreadID: DWORD;
ThreadHandle: THandle;

procedure TConnection.Read(Sender: TObject; Socket: TCustomWinSocket);
begin
WriteLn(Socket.ReceiveText);
end;

procedure TConnection.Connect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
end;

procedure TConnection.Error(Sender: TObject; Socket: TCustomWinSocket;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
end;

procedure TConnection.Disconnect(Sender: TObject;
  Socket: TCustomWinSocket);
begin
end;


procedure ConThread(zahl: Pointer)stdcall;
begin
    While Not ClientSocket.Socket.Connected Do
      begin
      Sleep(500);
      Clientsocket.Open;
      end;
end;


begin
Connection := TConnection.Create;
ClientSocket := TClientSocket.Create;
ClientSocket.OnRead := Connection.Read;
ClientSocket.OnError := Connection.Error;
ClientSocket.OnConnect := Connection.Connect;
ClientSocket.OnDisconnect := Connection.Disconnect;
ClientSocket.Host := 'localhost';
ClientSocket.Port := 123;

 ThreadHandle:=CreateThread(nil, 0, TFNThreadStartRoutine(@ConThread),
  nil, 0, ThreadID);
 If ThreadHandle <> 0 Then CloseHandle(ThreadHandle);

While True Do
  Begin
  Sleep(100);
  If PeekMessage(Msg, 0, 0, 0, PM_REMOVE) Then
  Begin
  if Msg.Message <> $0012 then
    Begin
    TranslateMessage(Msg);
    DispatchMessage(Msg);
    End
  Else
    Begin
    Break;
    End;
  End;
end;
end.
im übrigen wartet der server nur mit serversocket.open.

irgentwelche vorschläge?
danke

blackdrake 23. Apr 2009 01:25

Re: automatisches verbinden eines konsolen-winsockclients
 
Toll wäre es natürlich, wenn du einen Thread aufmacht, der eine while-true Endlos-Schleife besitzt, die ständig abfrägt, ob der Socket vom Server offen ist, also eine Verbindung hergestellt werden kann und dann die gewünschten Transaktionen durchführt. (Lass aber so 60 Sekunden Zeit zwischen den Abfragen, damit du den Server nicht zuspamst)

Zitat:

Zitat von ToXiC
Delphi-Quellcode:
 ThreadHandle:=CreateThread(nil, 0, TFNThreadStartRoutine(@ConThread),
  nil, 0, ThreadID);
 If ThreadHandle <> 0 Then CloseHandle(ThreadHandle);

Den Abschnitt verstehe ich nicht ganz. Welchen Thread erzeugst du da?

Zitat:

Zitat von ToXiC
im übrigen wartet der server nur mit serversocket.open.

Wenn du mit "server" deine (Server/Daemon)-Anwendung meinst, dann bräuchtest du doch nicht mal Threads, oder? Es ist unbedenklich, bei einer Daemon-Applikation eine Endlosschleife im Haupt-Thread zu haben, da der Dienst ja eh nichts anderes macht, außer warten und keine grafischen Bedientelemente enthält, die "hängen" können.

Ich wüde also eine serversocket.open oder canconnect etc. direkt in die Schleife, die du derzeit als Nachrichtenschleife verwendest, reinpacken.

Gruß
blackdrake

(Sollte dieser Thread nicht ins Unterforum für Netzwerkprogrammierung?)

mkinzler 23. Apr 2009 05:39

Re: automatisches verbinden eines konsolen-winsockclients
 
Zitat:

(Sollte dieser Thread nicht ins Unterforum für Netzwerkprogrammierung?)
Ja

DP-Maintenance 23. Apr 2009 05:39

DP-Maintenance
 
Dieses Thema wurde von "mkinzler" von "Object-Pascal / Delphi-Language" nach "Internet / LAN / ASP.NET" verschoben.
Passt besser hier rein


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