ASyncSocket

About this

ASyncSocket is Delphi's socket component based on Winsock2.

Common property of this as follows :

  • Winsock2 based
  • IPv6 Support
  • Asynchronous TCP Server and Client
  • UnicodeString support (Delphi 2009 or abobe)
  • TextBase send/receive interface is available

Download

Download (CodeCentral)

Example

Simple echo server and HTTP client.

unit ASyncSocketExample;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, ASyncSocket, StdCtrls;



type

  TForm1 = class(TForm)
    Button1: TButton;
    ListBox1: TListBox;
    Button2: TButton;
    ASyncTCPClient1: TASyncTCPClient;
    ASyncTCPServer1: TASyncTCPServer;
    procedure Button1Click(Sender: TObject);
    procedure Button2Click(Sender: TObject);
    procedure ASyncTCPClient1Connect(Sender: TObject; Socket: Cardinal);
    procedure ASyncTCPClient1Disconnect(Sender: TObject; Socket: Cardinal);
    procedure ASyncTCPClient1Read(Sender: TObject; Socket: Cardinal);
    procedure ASyncTCPServer1Connect(Sender: TObject; Socket: Cardinal);
    procedure ASyncTCPServer1Disconnect(Sender: TObject; Socket: Cardinal);
    procedure ASyncTCPServer1Read(Sender: TObject; Socket: Cardinal);
    procedure ASyncTCPServer1Error(Sender: TObject; Socket: Cardinal;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure ASyncTCPClient1Error(Sender: TObject; Socket: Cardinal;
      ErrorEvent: TErrorEvent; var ErrorCode: Integer);
    procedure ASyncTCPClient1TryToConnect(Sender: TObject;
      DestinationHost: string; DestinationPort: Integer);
  private
  public
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.ASyncTCPClient1Connect(Sender: TObject; Socket: Cardinal);
begin
  ListBox1.Items.Add('ClientModeConnect : Connection Established '+ASyncTCPClient1.GetRemoteAddress());
  ASyncTCPClient1.WriteString('GET /robots.txt'#13#10);
end;

procedure TForm1.ASyncTCPClient1Disconnect(Sender: TObject; Socket: Cardinal);
begin
  ListBox1.Items.Add('ClientModeDisonnect : ClosingLink');
end;

procedure TForm1.ASyncTCPClient1Error(Sender: TObject; Socket: Cardinal;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  if (ErrorCode=10060) then
  begin
    ListBox1.Items.Add('ClientModeError - Connection timed out');
    ErrorCode:=0;
  end;
  if (ErrorCode=10061) then
  begin
    ListBox1.Items.Add('ClientModeError - Connection refused');
    ErrorCode:=0;
  end;
  if (ErrorCode=11001) then
  begin
    ListBox1.Items.Add('ClientModeError - Host not found');
    ErrorCode:=0;
  end;
  if (ErrorCode=10053) then
  begin
    ListBox1.Items.Add('ClientModeError - Software caused connection abort : '+ASyncTCPServer1.GetRemoteAddress(socket)+ASyncTCPServer1.GetRemoteHost(socket));
    ErrorCode:=0;
  end;
  if (ErrorCode=10054) then
  begin
    ListBox1.Items.Add('ClientModeError - Connection reset by peer : '+ASyncTCPServer1.GetRemoteAddress(socket));
    ErrorCode:=0;
  end;
end;

procedure TForm1.ASyncTCPClient1Read(Sender: TObject; Socket: Cardinal);
begin
  ListBox1.Items.Add('ClientModeRead : '+UnicodeString(ASyncTCPClient1.ReadString));
end;

procedure TForm1.ASyncTCPClient1TryToConnect(Sender: TObject;
  DestinationHost: string; DestinationPort: Integer);
begin
  ListBox1.Items.Add('ClientModeConnect : Try to connect '+DestinationHost);
end;

procedure TForm1.ASyncTCPServer1Connect(Sender: TObject; Socket: Cardinal);
begin
  caption:='Active Connection : '+IntToStr(ASyncTCPServer1.Connections.Count);
  ListBox1.Items.Add('Connect : '+ASyncTCPServer1.GetRemoteAddress(socket));
end;

procedure TForm1.ASyncTCPServer1Disconnect(Sender: TObject; Socket: Cardinal);
begin
  caption:='Active Connection : '+IntToStr(ASyncTCPServer1.Connections.Count-1);
  ListBox1.Items.Add('Disonnect : '+ASyncTCPServer1.GetRemoteAddress(socket));
end;

procedure TForm1.ASyncTCPServer1Error(Sender: TObject; Socket: Cardinal;
  ErrorEvent: TErrorEvent; var ErrorCode: Integer);
begin
  if (ErrorCode=10053) then
  begin
    caption:='Active Connection : '+IntToStr(ASyncTCPServer1.Connections.Count-1);
    ListBox1.Items.Add('Error - Software caused connection abort : '+ASyncTCPServer1.GetRemoteAddress(socket)+ASyncTCPServer1.GetRemoteHost(socket));
    ErrorCode:=0;
  end;
  if (ErrorCode=10054) then
  begin
    caption:='Active Connection : '+IntToStr(ASyncTCPServer1.Connections.Count-1);
    ListBox1.Items.Add('Error - Connection reset by peer : '+ASyncTCPServer1.GetRemoteAddress(socket));
    ErrorCode:=0;
  end;
end;

procedure TForm1.ASyncTCPServer1Read(Sender: TObject; Socket: Cardinal);
begin
  ASyncTCPServer1.WriteString(socket,ASyncTCPServer1.ReadString(socket));
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  ASyncTCPServer1.Active:=false;
  ASyncTCPClient1.Active:=false;
end;

procedure TForm1.Button2Click(Sender: TObject);
begin
  if (ASyncTCPServer1.Connections.Count>0) then
    ASyncTCPServer1.Disconnect(ASyncTCPServer1.Connections[0]);
  ASyncTCPClient1.Active:=not ASyncTCPClient1.Active;
end;

end.