Thema: Delphi System.Net.Sockets

Einzelnen Beitrag anzeigen

Kanonier

Registriert seit: 19. Nov 2004
Ort: Gelsenkirchen
19 Beiträge
 
#1

System.Net.Sockets

  Alt 7. Dez 2004, 12:46
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
Listener.BeginAccept(AsyncCallback(AsynchronousSocketListener.AcceptCallBack), Listener); Ausgeführt wird.
Kennt sich einer damit aus ??
Wenn es dich einmal erwischt hat erwischt es dich immer häufiger
  Mit Zitat antworten Zitat