sockets.pp 6.4 KB

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