sockets.pp 7.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 1999-2004 by the Free Pascal development team
  4. See the file COPYING.FPC, included in this distribution,
  5. for details about the copyright.
  6. This program is distributed in the hope that it will be useful,
  7. but WITHOUT ANY WARRANTY; without even the implied warranty of
  8. MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
  9. **********************************************************************}
  10. {$mode objfpc}
  11. unit Sockets;
  12. Interface
  13. {$macro on}
  14. {$define maybelibc:=}
  15. {$R-}
  16. Uses
  17. winsock;
  18. Type
  19. cushort=word;
  20. cuint8 =byte;
  21. cuint16=word;
  22. cuint32=cardinal;
  23. size_t =cuint32;
  24. ssize_t=cuint16;
  25. cint =longint;
  26. pcint =^cint;
  27. tsocklen=cint;
  28. psocklen=^tsocklen;
  29. const
  30. EsockEINTR = WSAEINTR;
  31. EsockEBADF = WSAEBADF;
  32. EsockEFAULT = WSAEFAULT;
  33. EsockEINVAL = WSAEINVAL;
  34. EsockEACCESS = WSAEACCES;
  35. EsockEMFILE = WSAEMFILE;
  36. EsockEMSGSIZE = WSAEMSGSIZE;
  37. EsockENOBUFS = WSAENOBUFS;
  38. EsockENOTCONN = WSAENOTCONN;
  39. EsockENOTSOCK = WSAENOTSOCK;
  40. EsockEPROTONOSUPPORT = WSAEPROTONOSUPPORT;
  41. EsockEWOULDBLOCK = WSAEWOULDBLOCK;
  42. {$i netwsockh.inc}
  43. {$i socketsh.inc}
  44. Implementation
  45. {******************************************************************************
  46. Basic Socket Functions
  47. ******************************************************************************}
  48. //function fprecvmsg (s:cint; msg: pmsghdr; flags:cint):ssize_t;
  49. //function fpsendmsg (s:cint; hdr: pmsghdr; flags:cint):ssize;
  50. //function fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
  51. function SocketError: cint;
  52. begin
  53. SocketError := WSAGetLastError;
  54. end;
  55. function fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
  56. begin
  57. fpSocket:=WinSock.Socket(Domain,xtype,ProtoCol);
  58. end;
  59. function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
  60. begin
  61. fpSend:=WinSock.Send(S,msg,len,flags);
  62. end;
  63. function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
  64. begin
  65. // Dubious construct, this should be checked. (IPV6 fails ?)
  66. fpSendTo:=WinSock.SendTo(S,msg,Len,Flags,Winsock.TSockAddr(tox^),toLen);
  67. end;
  68. function fprecv (s:cint; buf: pointer; len: size_t; flags: cint):ssize_t;
  69. begin
  70. fpRecv:=WinSock.Recv(S,Buf,Len,Flags);
  71. end;
  72. function fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
  73. begin
  74. fpRecvFrom:=WinSock.RecvFrom(S,Buf,Len,Flags,Winsock.TSockAddr(from^),FromLen^);
  75. end;
  76. function fpconnect (s:cint; name : psockaddr; namelen : tsocklen):cint;
  77. begin
  78. fpConnect:=WinSock.Connect(S,WinSock.TSockAddr(name^),nameLen);
  79. end;
  80. function fpshutdown (s:cint; how:cint):cint;
  81. begin
  82. fpShutDown:=WinSock.ShutDown(S,How);
  83. end;
  84. Function socket(Domain,SocketType,Protocol:Longint):Longint;
  85. begin
  86. socket:=fpsocket(Domain,sockettype,protocol);
  87. end;
  88. Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
  89. begin
  90. send:=fpsend(sock,@buf,buflen,flags);
  91. end;
  92. Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
  93. begin
  94. sendto:=fpsendto(sock,@buf,buflen,flags,@addr,addrlen);
  95. end;
  96. Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
  97. begin
  98. Recv:=fpRecv(Sock,@Buf,BufLen,Flags);
  99. end;
  100. Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr; var AddrLen : longint) : longint;
  101. begin
  102. RecvFrom:=fpRecvFrom(Sock,@Buf,BufLen,Flags,@Addr,@AddrLen);
  103. end;
  104. function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
  105. begin
  106. fpbind:=WinSock.Bind(S,WinSock.PSockAddr(Addrx),AddrLen);
  107. end;
  108. function fplisten (s:cint; backlog : cint):cint;
  109. begin
  110. fplisten:=WinSock.Listen(S,backlog);
  111. end;
  112. function fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
  113. begin
  114. fpAccept:=WinSock.Accept(S,WinSock.PSockAddr(Addrx),plongint(AddrLen));
  115. end;
  116. function fpgetsockname (s:cint; name : psockaddr; namelen : psocklen):cint;
  117. begin
  118. fpGetSockName:=WinSock.GetSockName(S,WinSock.TSockAddr(name^),nameLen^);
  119. end;
  120. function fpgetpeername (s:cint; name : psockaddr; namelen : psocklen):cint;
  121. begin
  122. fpGetPeerName:=WinSock.GetPeerName(S,WinSock.TSockAddr(name^),NameLen^);
  123. end;
  124. function fpgetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
  125. begin
  126. fpGetSockOpt:=WinSock.GetSockOpt(S,Level,OptName,OptVal,OptLen^);
  127. end;
  128. function fpsetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen :tsocklen):cint;
  129. begin
  130. fpSetSockOpt:=WinSock.SetSockOpt(S,Level,OptName,OptVal,OptLen);
  131. end;
  132. function fpsocketpair (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
  133. begin
  134. fpSocketPair := -1;
  135. end;
  136. Function CloseSocket(Sock:Longint):Longint;
  137. begin
  138. CloseSocket := Winsock.CloseSocket (Sock);
  139. end;
  140. Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
  141. begin
  142. bind:=fpBind(Sock,@Addr,AddrLen)=0;
  143. end;
  144. Function Listen(Sock,MaxConnect:Longint):Boolean;
  145. begin
  146. Listen:=fplisten(Sock,MaxConnect)=0;
  147. end;
  148. Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  149. begin
  150. Accept:=FPAccept(sock,@addr,@addrlen);
  151. end;
  152. Function Shutdown(Sock:Longint;How:Longint):Longint;
  153. begin
  154. shutdown:=fpshutdown(sock,how);
  155. end;
  156. Function Connect(Sock:Longint;Const Addr;Addrlen:Longint):Boolean;
  157. begin
  158. connect:=fpconnect(sock,@addr,addrlen)=0;
  159. end;
  160. Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  161. begin
  162. GetSocketName:=fpGetSockName(sock,@addr,@addrlen);
  163. end;
  164. Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  165. begin
  166. GetPeerName:=fpGetPeerName(Sock,@addr,@addrlen);
  167. end;
  168. Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
  169. begin
  170. GetSocketOptions:=fpGetSockOpt(sock,level,optname,@optval,@optlen);
  171. end;
  172. Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
  173. begin
  174. SetSocketOptions:=fpsetsockopt(sock,level,optname,@optval,optlen);
  175. end;
  176. Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
  177. begin
  178. // SocketPair:=SocketCall(Socket_Sys_SocketPair,Domain,SocketType,Protocol,longint(@Pair),0,0);
  179. SocketPair := -1;
  180. end;
  181. {$ifdef unix}
  182. { mimic the linux fpWrite/fpRead calls for the file/text socket wrapper }
  183. function fpWrite(handle : longint;Const bufptr;size : dword) : dword;
  184. begin
  185. fpWrite := dword(WinSock.send(handle, bufptr, size, 0));
  186. if fpWrite = dword(SOCKET_ERROR) then
  187. fpWrite := 0;
  188. end;
  189. function fpRead(handle : longint;var bufptr;size : dword) : dword;
  190. var
  191. d : dword;
  192. begin
  193. if ioctlsocket(handle,FIONREAD,@d) = SOCKET_ERROR then
  194. begin
  195. fpRead:=0;
  196. exit;
  197. end;
  198. if d>0 then
  199. begin
  200. if size>d then
  201. size:=d;
  202. fpRead := dword(WinSock.recv(handle, bufptr, size, 0));
  203. if fpRead = dword(SOCKET_ERROR) then
  204. fpRead := 0;
  205. end;
  206. end;
  207. {$else}
  208. { mimic the linux fpWrite/fpRead calls for the file/text socket wrapper }
  209. function fpWrite(handle : longint;Const bufptr;size : dword) : dword;
  210. begin
  211. fpWrite := dword(WinSock.send(handle, bufptr, size, 0));
  212. if fpWrite = dword(SOCKET_ERROR) then
  213. fpWrite := 0;
  214. end;
  215. function fpRead(handle : longint;var bufptr;size : dword) : dword;
  216. var
  217. d : dword;
  218. begin
  219. if ioctlsocket(handle,FIONREAD,@d) = SOCKET_ERROR then
  220. begin
  221. fpRead:=0;
  222. exit;
  223. end;
  224. if d>0 then
  225. begin
  226. if size>d then
  227. size:=d;
  228. fpRead := dword(WinSock.recv(handle, bufptr, size, 0));
  229. if fpRead = dword(SOCKET_ERROR) then
  230. fpRead := 0;
  231. end;
  232. end;
  233. {$endif}
  234. {$i sockets.inc}
  235. { winsocket stack needs an init. and cleanup code }
  236. var
  237. wsadata : twsadata;
  238. initialization
  239. WSAStartUp($2,wsadata);
  240. finalization
  241. WSACleanUp;
  242. end.