sockets.pp 6.1 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263
  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 SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
  44. begin
  45. // Dubious construct, this should be checked.
  46. SendTo:=WinSock.SendTo(Sock,Buf,BufLen,Flags,Winsock.TSockAddr(Addr),AddrLen);
  47. if SendTo<0 then
  48. SocketError:=WSAGetLastError
  49. else
  50. SocketError:=0;
  51. end;
  52. Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
  53. begin
  54. Recv:=WinSock.Recv(Sock,Buf,BufLen,Flags);
  55. if Recv<0 then
  56. SocketError:=WSAGetLastError
  57. else
  58. SocketError:=0;
  59. end;
  60. Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr; AddrLen : Integer) : longint;
  61. begin
  62. RecvFrom:=WinSock.RecvFrom(Sock,Buf,BufLen,Flags,Winsock.TSockAddr(Addr),AddrLen);
  63. if RecvFrom<0 then
  64. SocketError:=WSAGetLastError
  65. else
  66. SocketError:=0;
  67. end;
  68. Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
  69. var
  70. l : longint;
  71. begin
  72. l:=WinSock.Bind(Sock,WinSock.PSockAddr(@Addr),AddrLen);
  73. if l<0 then
  74. begin
  75. SocketError:=WSAGetLastError;
  76. Bind:=false;
  77. end
  78. else
  79. begin
  80. SocketError:=0;
  81. Bind:=true;
  82. end;
  83. end;
  84. Function Listen(Sock,MaxConnect:Longint):Boolean;
  85. var
  86. l : longint;
  87. begin
  88. l:=WinSock.Listen(Sock,MaxConnect);
  89. if l<0 then
  90. begin
  91. SocketError:=WSAGetLastError;
  92. Listen:=false;
  93. end
  94. else
  95. begin
  96. SocketError:=0;
  97. Listen:=true;
  98. end;
  99. end;
  100. Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  101. begin
  102. Accept:=WinSock.Accept(Sock,WinSock.PSockAddr(@Addr),plongint(@AddrLen));
  103. if Accept<0 then
  104. SocketError:=WSAGetLastError
  105. else
  106. SocketError:=0;
  107. end;
  108. Function Connect(Sock:Longint;Const Addr;Addrlen:Longint):Boolean;
  109. begin
  110. Connect:=WinSock.Connect(Sock,WinSock.TSockAddr(Addr),AddrLen)=0;
  111. if not Connect then
  112. SocketError:=WSAGetLastError
  113. else
  114. SocketError:=0;
  115. end;
  116. Function Shutdown(Sock:Longint;How:Longint):Longint;
  117. begin
  118. ShutDown:=WinSock.ShutDown(Sock,How);
  119. if ShutDown<0 then
  120. SocketError:=WSAGetLastError
  121. else
  122. SocketError:=0;
  123. end;
  124. Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  125. begin
  126. GetSocketName:=WinSock.GetSockName(Sock,WinSock.TSockAddr(Addr),AddrLen);
  127. if GetSocketName<0 then
  128. SocketError:=WSAGetLastError
  129. else
  130. SocketError:=0;
  131. end;
  132. Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  133. begin
  134. GetPeerName:=WinSock.GetPeerName(Sock,WinSock.TSockAddr(Addr),AddrLen);
  135. if GetPeerName<0 then
  136. SocketError:=WSAGetLastError
  137. else
  138. SocketError:=0;
  139. end;
  140. Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
  141. begin
  142. SetSocketOptions:=WinSock.SetSockOpt(Sock,Level,OptName,OptVal,OptLen);
  143. if SetSocketOptions<0 then
  144. SocketError:=WSAGetLastError
  145. else
  146. SocketError:=0;
  147. end;
  148. Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
  149. begin
  150. GetSocketOptions:=WinSock.GetSockOpt(Sock,Level,OptName,OptVal,OptLen);
  151. if GetSocketOptions<0 then
  152. SocketError:=WSAGetLastError
  153. else
  154. SocketError:=0;
  155. end;
  156. Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
  157. begin
  158. // SocketPair:=SocketCall(Socket_Sys_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
  159. end;
  160. { mimic the linux fdWrite/fdRead calls for the file/text socket wrapper }
  161. function fdWrite(handle : longint;Const bufptr;size : dword) : dword;
  162. begin
  163. fdWrite := dword(WinSock.send(handle, bufptr, size, 0));
  164. if fdWrite = dword(SOCKET_ERROR) then
  165. begin
  166. SocketError := WSAGetLastError;
  167. fdWrite := 0;
  168. end
  169. else
  170. SocketError := 0;
  171. end;
  172. function fdRead(handle : longint;var bufptr;size : dword) : dword;
  173. var
  174. d : dword;
  175. begin
  176. if ioctlsocket(handle,FIONREAD,@d) = SOCKET_ERROR then
  177. begin
  178. SocketError:=WSAGetLastError;
  179. fdRead:=0;
  180. exit;
  181. end;
  182. if d>0 then
  183. begin
  184. if size>d then
  185. size:=d;
  186. fdRead := dword(WinSock.recv(handle, bufptr, size, 0));
  187. if fdRead = dword(SOCKET_ERROR) then
  188. begin
  189. SocketError:= WSAGetLastError;
  190. fdRead := 0;
  191. end else
  192. SocketError:=0;
  193. end
  194. else
  195. SocketError:=0;
  196. end;
  197. {$i sockets.inc}
  198. { winsocket stack needs an init. and cleanup code }
  199. var
  200. wsadata : twsadata;
  201. initialization
  202. WSAStartUp($2,wsadata);
  203. finalization
  204. WSACleanUp;
  205. end.
  206. {
  207. $Log$
  208. Revision 1.10 2003-01-01 14:34:22 peter
  209. * sendto overload
  210. Revision 1.9 2002/09/07 16:01:29 peter
  211. * old logs removed and tabs fixed
  212. Revision 1.8 2002/07/17 07:28:21 pierre
  213. * avoid constant evaluation problems if cycling with -Cr
  214. Revision 1.7 2002/02/04 21:41:15 michael
  215. + merged ixed syntax
  216. Revision 1.6 2002/02/04 21:29:34 michael
  217. + merged missing sendto/rcvfrom functions
  218. }