sockets.pp 4.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223
  1. {
  2. $Id$
  3. This file is part of the Free Pascal run time library.
  4. Copyright (c) 1999-2000 by the Free Pascal development team
  5. See the file COPYING.FPC, included in this distribution,
  6. for details about the copyright.
  7. This program is distributed in the hope that it will be useful,
  8. but WITHOUT ANY WARRANTY; without even the implied warranty of
  9. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  10. **********************************************************************}
  11. {$mode objfpc}
  12. unit Sockets;
  13. Interface
  14. Uses
  15. windows,winsock;
  16. Const
  17. AF_MAX = WinSock.AF_MAX;
  18. PF_MAX = AF_MAX;
  19. {$i socketsh.inc}
  20. Implementation
  21. { Include filerec and textrec structures }
  22. {$i filerec.inc}
  23. {$i textrec.inc}
  24. {******************************************************************************
  25. Basic Socket Functions
  26. ******************************************************************************}
  27. Function socket(Domain,SocketType,Protocol:Longint):Longint;
  28. begin
  29. Socket:=WinSock.Socket(Domain,SocketType,ProtoCol);
  30. if Socket<0 then
  31. SocketError:=WSAGetLastError
  32. else
  33. SocketError:=0;
  34. end;
  35. Function Send(Sock:Longint;Var Addr;AddrLen,Flags:Longint):Longint;
  36. begin
  37. Send:=WinSock.Send(Sock,Addr,AddrLen,Flags);
  38. if Send<0 then
  39. SocketError:=WSAGetLastError
  40. else
  41. SocketError:=0;
  42. end;
  43. Function Recv(Sock:Longint;Var Addr;AddrLen,Flags:Longint):Longint;
  44. begin
  45. Recv:=WinSock.Recv(Sock,Addr,AddrLen,Flags);
  46. if Recv<0 then
  47. SocketError:=WSAGetLastError
  48. else
  49. SocketError:=0;
  50. end;
  51. Function Bind(Sock:Longint;Var Addr;AddrLen:Longint):Boolean;
  52. var
  53. l : longint;
  54. begin
  55. l:=WinSock.Bind(Sock,WinSock.PSockAddr(@Addr),AddrLen);
  56. if l<0 then
  57. begin
  58. SocketError:=WSAGetLastError;
  59. Bind:=false;
  60. end
  61. else
  62. begin
  63. SocketError:=0;
  64. Bind:=true;
  65. end;
  66. end;
  67. Function Listen(Sock,MaxConnect:Longint):Boolean;
  68. var
  69. l : longint;
  70. begin
  71. l:=WinSock.Listen(Sock,MaxConnect);
  72. if l<0 then
  73. begin
  74. SocketError:=WSAGetLastError;
  75. Listen:=false;
  76. end
  77. else
  78. begin
  79. SocketError:=0;
  80. Listen:=true;
  81. end;
  82. end;
  83. Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  84. begin
  85. Accept:=WinSock.Accept(Sock,WinSock.PSockAddr(@Addr),plongint(@AddrLen));
  86. if Accept<0 then
  87. SocketError:=WSAGetLastError
  88. else
  89. SocketError:=0;
  90. end;
  91. Function Connect(Sock:Longint;Var Addr;Addrlen:Longint):Boolean;
  92. begin
  93. Connect:=WinSock.Connect(Sock,WinSock.TSockAddr(Addr),AddrLen)=0;
  94. if Connect then
  95. SocketError:=WSAGetLastError
  96. else
  97. SocketError:=0;
  98. end;
  99. Function Shutdown(Sock:Longint;How:Longint):Longint;
  100. begin
  101. ShutDown:=WinSock.ShutDown(Sock,How);
  102. if ShutDown<0 then
  103. SocketError:=WSAGetLastError
  104. else
  105. SocketError:=0;
  106. end;
  107. Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  108. begin
  109. GetSocketName:=WinSock.GetSockName(Sock,WinSock.TSockAddr(Addr),AddrLen);
  110. if GetSocketName<0 then
  111. SocketError:=WSAGetLastError
  112. else
  113. SocketError:=0;
  114. end;
  115. Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  116. begin
  117. GetPeerName:=WinSock.GetPeerName(Sock,WinSock.TSockAddr(Addr),AddrLen);
  118. if GetPeerName<0 then
  119. SocketError:=WSAGetLastError
  120. else
  121. SocketError:=0;
  122. end;
  123. Function SetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;optlen:longint):Longint;
  124. begin
  125. SetSocketOptions:=WinSock.SetSockOpt(Sock,Level,OptName,OptVal,OptLen);
  126. if SetSocketOptions<0 then
  127. SocketError:=WSAGetLastError
  128. else
  129. SocketError:=0;
  130. end;
  131. Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;optlen:longint):Longint;
  132. begin
  133. GetSocketOptions:=WinSock.GetSockOpt(Sock,Level,OptName,OptVal,OptLen);
  134. if GetSocketOptions<0 then
  135. SocketError:=WSAGetLastError
  136. else
  137. SocketError:=0;
  138. end;
  139. Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
  140. begin
  141. // SocketPair:=SocketCall(Socket_Sys_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
  142. end;
  143. { mimic the linux fdWrite/fdRead calls for the file/text socket wrapper }
  144. function fdWrite(handle : longint;var bufptr;size : dword) : dword;
  145. var
  146. d : dword;
  147. begin
  148. if not(Windows.WriteFile(handle,bufptr,size,d,nil)) then
  149. SocketError:=Windows.GetLastError
  150. else
  151. SocketError:=0;
  152. fdWrite:=d;
  153. end;
  154. function fdRead(handle : longint;var bufptr;size : dword) : dword;
  155. var
  156. d : dword;
  157. begin
  158. if not(Windows.ReadFile(handle,bufptr,size,d,nil)) then
  159. SocketError:=Windows.GetLastError
  160. else
  161. SocketError:=0;
  162. fdRead:=d;
  163. end;
  164. {$i sockets.inc}
  165. { winsocket stack needs an init. and cleanup code }
  166. var
  167. wsadata : twsadata;
  168. initialization
  169. WSAStartUp($2,wsadata);
  170. finalization
  171. WSACleanUp;
  172. end.
  173. {
  174. $Log$
  175. Revision 1.5 2000-02-09 16:59:34 peter
  176. * truncated log
  177. Revision 1.4 2000/01/07 16:41:52 daniel
  178. * copyright 2000
  179. Revision 1.3 2000/01/07 16:32:34 daniel
  180. * copyright 2000 added
  181. }