Delphi/FPC: Port Windows WinSock-based Socket classes to Mac
$30-250 USD
Cancelled
Posted about 11 years ago
$30-250 USD
Paid on delivery
Port existing Windows Sockets-based Pascal language classes library to Mac OS (Delphi or Lazarus programming environment). Need support for both TCP and UDP protocols (SOCK_STREAM/SOCK_DGRAM), blocking and non-blocking sockets; don't using Indy. Non blocking sockets should not use separate thread per each socket.
Classes to port:
//private fields/methods are omitted
------------------- >8 ----------------------------
type
//events
TIPSocketOnAccept = procedure (socket:TIPSocket);
TIPSocketOnConnecting = TIPSocketOnAccept;
TIPSocketOnRead = TIPSocketOnAccept;
TIPSocketOnConnect = TIPSocketOnAccept;
//base class for TCP/UDP sockets
TIPSocket = class
public
property Addr:sockaddr_in read GetAddr write FAddr;
property Host:string read GetHost write SetHost;
property Address:string read GetAddress write SetAddress;
property Port:integer read GetPort write SetPort;
property RemoteIP:string read GetRemoteIp;
property Error:cardinal read FError;
property Socket:TSocket read FSocket;
function NoAddr:boolean; // true if address/port is not set
constructor Create(const asynchronous:boolean = true);
destructor Destroy;override;
function EnableAsync:boolean;virtual; //enable non-blocking mode
function DisableAsync:boolean;virtual; //disable non-blocking mode
function Send(data:pointer; cb:cardinal):integer;virtual;abstract;
function Rece(data:pointer; cb:cardinal):integer;virtual;abstract;
procedure Close;
function BytesReceived:cardinal;
procedure SendReadSignal; // for non-blocking sockets sends FD_READ event to enforce reading data from the non-blocking socket.
class function GetRemoteComputerName(ip:ansistring):string; static;
class function ResolveHostName(s:ansistring):ansistring; static;
class function StrToAddr(s:ansistring):integer;static;
class function Select(nfds:Integer; readFDS, writeFDS, exceptFDS:PFDSet; timeout:PTimeVal):integer;
end;
TTCPSocket = class(TIPSocket)
private
public
property OnRead:TIPSocketOnRead read FOnRead write FOnRead;
property OnClose:TIPSocketOnRead read FOnClose write FOnClose;
constructor Create(const asynchronous:boolean = true; const basesock:TSocket = -1);
function EnableAsync:boolean;override;
function Connect:boolean;virtual;
function Send(data:pointer; cb:cardinal):integer;override;
function Rece(data:pointer; cb:cardinal):integer;override;
function SendBlock(data:pointer; cb:cardinal; const asynctimeout:integer = -1):integer;virtual; //sends long blocks (more than IO buffer size)
function ReceBlock(data:pointer; cb:cardinal; const asynctimeout:integer = -1):integer;virtual; //receives long blocks (more than IO buffer size)
end;
TTCPServerSocket = class(TTCPSocket)
private
public
property OnAccept:TIPSocketOnAccept read FOnAccept write FOnAccept;
property Error:cardinal read FError;
constructor Create(port:integer; const bindaddress:integer = INADDR_ANY; const asynchronous:boolean = true);
function Listen:integer;
function Accept:TTCPSocket;
function EnableAsync:boolean;override;
end;
TUDPSocket = class(TIPSocket)
private
public
constructor Create(const asynchronous:boolean = true);
property OnRead:TIPSocketOnRead read FOnRead write FOnRead;
function Broadcast(enable:boolean):boolean; //enables UDP Broadcast
function MulticastTTL(value:integer):boolean;
function Multicast(address:ansistring):boolean; //enables multicast for the specified address, adds itself to Multicast group
function Send(data:pointer; cb:cardinal; _toaddr:integer; _toport:word):integer;
function Rece(data:pointer; cb:cardinal; fromaddr:pinteger; fromport:pword):integer;
function EnableAsync:boolean;override;
end;
TUDPServerSocket = class(TUDPSocket)
private
public
constructor Create(port:integer; const bindaddress:integer = INADDR_ANY; const asynchronous:boolean = true);
end;