Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Netzwerke (https://www.delphipraxis.net/14-netzwerke/)
-   -   Delphi System.Net.Sockets (https://www.delphipraxis.net/35447-system-net-sockets.html)

Kanonier 7. Dez 2004 12:46


System.Net.Sockets
 
So ich habe mich die letzten tage etwas mit den Socket-Klasse von .Net beschäftigt. Habe mir vorallem die beispiele zum asynchronen Client und Server angeschaut gibt es leider nur für C# und VB. Jetzt habe ich versucht diese in Delphi umzusetzten. Klappt aber nicht ganz musste erstens ManualResetEvent durch tEvent ersetzten, weil ich die Set Funktion nicht compieliert bekomemn hab.


Hier mein Code.
Delphi-Quellcode:
program SocketServer;

{$APPTYPE CONSOLE}

uses
  SysUtils,
  System.Net.Sockets,
  System.Threading,
  System.Net,
  SyncObjs ;

type AsynchronousSocketListener = class
  public

  constructor Create;
  procedure StartListening;
  private
    allDone: TEvent;
  procedure AcceptCallBack(ar: IAsyncResult);
end;

constructor AsynchronousSocketListener.Create;
begin
  inherited Create;
  allDone := TEvent.Create(nil, False, False, '');
end;

procedure AsynchronousSocketListener.StartListening;
var Listener: Socket;
    Port: Integer;
    localEndPoint: IPEndPoint;
    ipHostInfo: IPHostEntry;
    localipAddress: IPAddress;
begin
try
  //Hostparamter
  Port := 1024;
  ipHostInfo := Dns.Resolve(Dns.GetHostName());
  localipAddress := ipHostInfo.AddressList[0];
  localEndPoint := IPEndPoint.Create(localipAddress, Port);
  //Ein Socket Initialiesieren
  Listener := Socket.Create(localEndPoint.AddressFamily,
                            SocketType.Stream,
                            ProtocolType.Tcp);
  //Den Socket einbinden
  Listener.Bind(localEndPoint);
  Listener.Listen(100);
  while(True) do
  begin
    allDone.Resetevent;
    //Den Socket in listen schalten
    Writeln('Server gestartet');
    Listener.BeginAccept(AsyncCallback(AsynchronousSocketListener.AcceptCallBack), Listener);
    // Wait until a connection is made before continung.
    allDone.WaitFor(50000);
  end;
  except
    writeln('öfnen eines Servers gescheitert');
  end;
end;

procedure AsynchronousSocketListener.AcceptCallBack(ar: IAsyncResult);
var Listener: Socket;
begin
  Listener := Socket(ar.AsyncState);
  Listener.EndAccept(ar);
  Writeln('Ein Client Connected');
  Listener.Shutdown(SocketShutdown.Both);
  Listener.Close;
  writeln('Verbindung beendet');
  allDone.SetEvent;
end;

var myserver: AsynchronousSocketListener;

begin
  myserver := AsynchronousSocketListener.Create;
  myserver.StartListening;
  { TODO -oUser -cConsole Main : Hier Code einfügen }
end.
Leider wird immer eine Ausnahme geworfen sobald
Delphi-Quellcode:
Listener.BeginAccept(AsyncCallback(AsynchronousSocketListener.AcceptCallBack), Listener);
Ausgeführt wird.
Kennt sich einer damit aus ??


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