fpc/rtl/win32/sockets.pp
2000-01-07 16:41:28 +00:00

227 lines
5.0 KiB
ObjectPascal

{
$Id$
This file is part of the Free Pascal run time library.
Copyright (c) 1999-2000 by the Free Pascal development team
See the file COPYING.FPC, included in this distribution,
for details about the copyright.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
**********************************************************************}
{$mode objfpc}
unit Sockets;
Interface
Uses
windows,winsock;
Const
AF_MAX = WinSock.AF_MAX;
PF_MAX = AF_MAX;
{$i socketsh.inc}
Implementation
{ Include filerec and textrec structures }
{$i filerec.inc}
{$i textrec.inc}
{******************************************************************************
Basic Socket Functions
******************************************************************************}
Function socket(Domain,SocketType,Protocol:Longint):Longint;
begin
Socket:=WinSock.Socket(Domain,SocketType,ProtoCol);
if Socket<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function Send(Sock:Longint;Var Addr;AddrLen,Flags:Longint):Longint;
begin
Send:=WinSock.Send(Sock,Addr,AddrLen,Flags);
if Send<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function Recv(Sock:Longint;Var Addr;AddrLen,Flags:Longint):Longint;
begin
Recv:=WinSock.Recv(Sock,Addr,AddrLen,Flags);
if Recv<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function Bind(Sock:Longint;Var Addr;AddrLen:Longint):Boolean;
var
l : longint;
begin
l:=WinSock.Bind(Sock,WinSock.PSockAddr(@Addr),AddrLen);
if l<0 then
begin
SocketError:=WSAGetLastError;
Bind:=false;
end
else
begin
SocketError:=0;
Bind:=true;
end;
end;
Function Listen(Sock,MaxConnect:Longint):Boolean;
var
l : longint;
begin
l:=WinSock.Listen(Sock,MaxConnect);
if l<0 then
begin
SocketError:=WSAGetLastError;
Listen:=false;
end
else
begin
SocketError:=0;
Listen:=true;
end;
end;
Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
begin
Accept:=WinSock.Accept(Sock,WinSock.PSockAddr(@Addr),plongint(@AddrLen));
if Accept<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function Connect(Sock:Longint;Var Addr;Addrlen:Longint):Boolean;
begin
Connect:=WinSock.Connect(Sock,WinSock.TSockAddr(Addr),AddrLen)=0;
if Connect then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function Shutdown(Sock:Longint;How:Longint):Longint;
begin
ShutDown:=WinSock.ShutDown(Sock,How);
if ShutDown<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
begin
GetSocketName:=WinSock.GetSockName(Sock,WinSock.TSockAddr(Addr),AddrLen);
if GetSocketName<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
begin
GetPeerName:=WinSock.GetPeerName(Sock,WinSock.TSockAddr(Addr),AddrLen);
if GetPeerName<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function SetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;optlen:longint):Longint;
begin
SetSocketOptions:=WinSock.SetSockOpt(Sock,Level,OptName,OptVal,OptLen);
if SetSocketOptions<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;optlen:longint):Longint;
begin
GetSocketOptions:=WinSock.GetSockOpt(Sock,Level,OptName,OptVal,OptLen);
if GetSocketOptions<0 then
SocketError:=WSAGetLastError
else
SocketError:=0;
end;
Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
begin
// SocketPair:=SocketCall(Socket_Sys_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
end;
{ mimic the linux fdWrite/fdRead calls for the file/text socket wrapper }
function fdWrite(handle : longint;var bufptr;size : dword) : dword;
var
d : dword;
begin
if not(Windows.WriteFile(handle,bufptr,size,d,nil)) then
SocketError:=Windows.GetLastError
else
SocketError:=0;
fdWrite:=d;
end;
function fdRead(handle : longint;var bufptr;size : dword) : dword;
var
d : dword;
begin
if not(Windows.ReadFile(handle,bufptr,size,d,nil)) then
SocketError:=Windows.GetLastError
else
SocketError:=0;
fdRead:=d;
end;
{$i sockets.inc}
{ winsocket stack needs an init. and cleanup code }
var
wsadata : twsadata;
initialization
WSAStartUp($2,wsadata);
finalization
WSACleanUp;
end.
{
$Log$
Revision 1.4 2000-01-07 16:41:52 daniel
* copyright 2000
Revision 1.3 2000/01/07 16:32:34 daniel
* copyright 2000 added
Revision 1.2 1999/07/03 15:16:48 michael
+ Fixed Connect call
Revision 1.1 1999/06/21 12:40:48 florian
+ initial revision, derieved from the linux version
}