sockets.pp 6.6 KB

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