sockets.pp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240
  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;Const Buf;BufLen,Flags:Longint):Longint;
  36. begin
  37. Send:=WinSock.Send(Sock,Buf,BufLen,Flags);
  38. if Send<0 then
  39. SocketError:=WSAGetLastError
  40. else
  41. SocketError:=0;
  42. end;
  43. Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
  44. begin
  45. Recv:=WinSock.Recv(Sock,Buf,BufLen,Flags);
  46. if Recv<0 then
  47. SocketError:=WSAGetLastError
  48. else
  49. SocketError:=0;
  50. end;
  51. Function Bind(Sock:Longint;Const 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;Const Addr;Addrlen:Longint):Boolean;
  92. begin
  93. Connect:=WinSock.Connect(Sock,WinSock.TSockAddr(Addr),AddrLen)=0;
  94. if not 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;Const 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;Var 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;Const bufptr;size : dword) : dword;
  145. begin
  146. fdWrite := WinSock.send(handle, bufptr, size, 0);
  147. if fdWrite = SOCKET_ERROR then
  148. begin
  149. SocketError := WSAGetLastError;
  150. fdWrite := 0;
  151. end
  152. else
  153. SocketError := 0;
  154. end;
  155. function fdRead(handle : longint;var bufptr;size : dword) : dword;
  156. var
  157. d : dword;
  158. begin
  159. if ioctlsocket(handle,FIONREAD,@d) = SOCKET_ERROR then
  160. begin
  161. SocketError:=WSAGetLastError;
  162. fdRead:=0;
  163. exit;
  164. end;
  165. if d>0 then
  166. begin
  167. if size>d then
  168. size:=d;
  169. fdRead := WinSock.recv(handle, bufptr, size, 0);
  170. if fdRead = SOCKET_ERROR then
  171. begin
  172. SocketError:= WSAGetLastError;
  173. fdRead := 0;
  174. end else
  175. SocketError:=0;
  176. end
  177. else
  178. SocketError:=0;
  179. end;
  180. {$i sockets.inc}
  181. { winsocket stack needs an init. and cleanup code }
  182. var
  183. wsadata : twsadata;
  184. initialization
  185. WSAStartUp($2,wsadata);
  186. finalization
  187. WSACleanUp;
  188. end.
  189. {
  190. $Log$
  191. Revision 1.5 2001-06-06 21:58:24 peter
  192. * Win32 fixes for Makefile so it doesn't require sh.exe
  193. Revision 1.4 2000/07/28 08:43:46 sg
  194. * Applied patch by Markus Kaemmerer: Fixes fdRead and fdWrite
  195. Revision 1.3 2000/07/28 06:34:53 sg
  196. * Applied patch to "Connect" by Markus Kaemmerer: WinSock.Connect returns
  197. zero when it succeeded, and not vice versa.
  198. Revision 1.2 2000/07/13 11:33:58 michael
  199. + removed logs
  200. }