|
@@ -0,0 +1,217 @@
|
|
|
|
+{
|
|
|
|
+ $Id$
|
|
|
|
+ This file is part of the Free Pascal run time library.
|
|
|
|
+ Copyright (c) 1993,99 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):Longint;
|
|
|
|
+
|
|
|
|
+begin
|
|
|
|
+ Connect:=WinSock.Connect(Sock,WinSock.TSockAddr(Addr),AddrLen);
|
|
|
|
+ if Connect<0 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.1 1999-06-21 12:40:48 florian
|
|
|
|
+ + initial revision, derieved from the linux version
|
|
|
|
+
|
|
|
|
+}
|