{ $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 not 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;Var 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; begin fdWrite := WinSock.send(handle, bufptr, size, 0); if fdWrite = SOCKET_ERROR then begin SocketError := WSAGetLastError; fdWrite := 0; end else SocketError := 0; end; function fdRead(handle : longint;var bufptr;size : dword) : dword; var d : dword; begin if ioctlsocket(handle,FIONREAD,@d) = SOCKET_ERROR then begin SocketError:=WSAGetLastError; fdRead:=0; exit; end; if d>0 then begin if size>d then size:=d; fdRead := WinSock.recv(handle, bufptr, size, 0); if fdRead = SOCKET_ERROR then begin SocketError:= WSAGetLastError; fdRead := 0; end else SocketError:=0; end else SocketError:=0; 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-07-28 08:43:46 sg * Applied patch by Markus Kaemmerer: Fixes fdRead and fdWrite Revision 1.3 2000/07/28 06:34:53 sg * Applied patch to "Connect" by Markus Kaemmerer: WinSock.Connect returns zero when it succeeded, and not vice versa. Revision 1.2 2000/07/13 11:33:58 michael + removed logs }