mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-14 18:59:28 +02:00
227 lines
5.0 KiB
ObjectPascal
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
|
|
|
|
}
|