sockets.pp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325
  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. {$ifdef unix}
  175. { mimic the linux fpWrite/fpRead calls for the file/text socket wrapper }
  176. function fpWrite(handle : longint;Const bufptr;size : dword) : dword;
  177. begin
  178. fpWrite := dword(WinSock.send(handle, bufptr, size, 0));
  179. if fpWrite = dword(SOCKET_ERROR) then
  180. begin
  181. SocketError := WSAGetLastError;
  182. fpWrite := 0;
  183. end
  184. else
  185. SocketError := 0;
  186. end;
  187. function fpRead(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. fpRead:=0;
  195. exit;
  196. end;
  197. if d>0 then
  198. begin
  199. if size>d then
  200. size:=d;
  201. fpRead := dword(WinSock.recv(handle, bufptr, size, 0));
  202. if fpRead = dword(SOCKET_ERROR) then
  203. begin
  204. SocketError:= WSAGetLastError;
  205. fpRead := 0;
  206. end else
  207. SocketError:=0;
  208. end
  209. else
  210. SocketError:=0;
  211. end;
  212. {$else}
  213. { mimic the linux fdWrite/fdRead calls for the file/text socket wrapper }
  214. function fdWrite(handle : longint;Const bufptr;size : dword) : dword;
  215. begin
  216. fdWrite := dword(WinSock.send(handle, bufptr, size, 0));
  217. if fdWrite = dword(SOCKET_ERROR) then
  218. begin
  219. SocketError := WSAGetLastError;
  220. fdWrite := 0;
  221. end
  222. else
  223. SocketError := 0;
  224. end;
  225. function fdRead(handle : longint;var bufptr;size : dword) : dword;
  226. var
  227. d : dword;
  228. begin
  229. if ioctlsocket(handle,FIONREAD,@d) = SOCKET_ERROR then
  230. begin
  231. SocketError:=WSAGetLastError;
  232. fdRead:=0;
  233. exit;
  234. end;
  235. if d>0 then
  236. begin
  237. if size>d then
  238. size:=d;
  239. fdRead := dword(WinSock.recv(handle, bufptr, size, 0));
  240. if fdRead = dword(SOCKET_ERROR) then
  241. begin
  242. SocketError:= WSAGetLastError;
  243. fdRead := 0;
  244. end else
  245. SocketError:=0;
  246. end
  247. else
  248. SocketError:=0;
  249. end;
  250. {$endif}
  251. {$i sockets.inc}
  252. { winsocket stack needs an init. and cleanup code }
  253. var
  254. wsadata : twsadata;
  255. initialization
  256. WSAStartUp($2,wsadata);
  257. finalization
  258. WSACleanUp;
  259. end.
  260. {
  261. $Log$
  262. Revision 1.12 2003-09-17 15:06:36 peter
  263. * stdcall patch
  264. Revision 1.11 2003/03/23 17:47:15 armin
  265. * CloseSocket added
  266. Revision 1.10 2003/01/01 14:34:22 peter
  267. * sendto overload
  268. Revision 1.9 2002/09/07 16:01:29 peter
  269. * old logs removed and tabs fixed
  270. Revision 1.8 2002/07/17 07:28:21 pierre
  271. * avoid constant evaluation problems if cycling with -Cr
  272. Revision 1.7 2002/02/04 21:41:15 michael
  273. + merged ixed syntax
  274. Revision 1.6 2002/02/04 21:29:34 michael
  275. + merged missing sendto/rcvfrom functions
  276. }