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 ??