sockets.pp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271
  1. {
  2. This file is part of the Free Pascal run time library.
  3. Copyright (c) 1999-2000 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. Uses
  16. winsock2,ctypes;
  17. Type
  18. size_t = cuint32;
  19. ssize_t = cint32;
  20. tsocklen= cint;
  21. psocklen= ^tsocklen;
  22. const
  23. EsockEINTR = WSAEINTR;
  24. EsockEBADF = WSAEBADF;
  25. EsockEFAULT = WSAEFAULT;
  26. EsockEINVAL = WSAEINVAL;
  27. EsockEACCESS = WSAEACCES;
  28. EsockEMFILE = WSAEMFILE;
  29. EsockEMSGSIZE = WSAEMSGSIZE;
  30. EsockENOBUFS = WSAENOBUFS;
  31. EsockENOTCONN = WSAENOTCONN;
  32. EsockENOTSOCK = WSAENOTSOCK;
  33. EsockEPROTONOSUPPORT = WSAEPROTONOSUPPORT;
  34. EsockEWOULDBLOCK = WSAEWOULDBLOCK;
  35. {$i socketsh.inc}
  36. {$i fpwinsockh.inc}
  37. Implementation
  38. { Include filerec and textrec structures }
  39. {$i filerec.inc}
  40. {$i textrec.inc}
  41. {******************************************************************************
  42. Basic Socket Functions
  43. ******************************************************************************}
  44. //function fprecvmsg (s:cint; msg: pmsghdr; flags:cint):ssize_t;
  45. //function fpsendmsg (s:cint; hdr: pmsghdr; flags:cint):ssize;
  46. //function fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
  47. function socketerror:cint;
  48. begin
  49. result:=wsagetlasterror;
  50. end;
  51. function fpsocket (domain:cint; xtype:cint; protocol: cint):cint;
  52. begin
  53. fpSocket:=WinSock2.Socket(Domain,xtype,ProtoCol);
  54. end;
  55. function fpsend (s:cint; msg:pointer; len:size_t; flags:cint):ssize_t;
  56. begin
  57. fpSend:=WinSock2.Send(S,msg,len,flags);
  58. end;
  59. function fpsendto (s:cint; msg:pointer; len:size_t; flags:cint; tox :psockaddr; tolen: tsocklen):ssize_t;
  60. begin
  61. // Dubious construct, this should be checked. (IPV6 fails ?)
  62. fpSendTo:=WinSock2.SendTo(S,msg,Len,Flags,Winsock2.PSockAddr(tox),toLen);
  63. end;
  64. function fprecv (s:cint; buf: pointer; len: size_t; flags: cint):ssize_t;
  65. begin
  66. fpRecv:=WinSock2.Recv(S,Buf,Len,Flags);
  67. end;
  68. function fprecvfrom (s:cint; buf: pointer; len: size_t; flags: cint; from : psockaddr; fromlen : psocklen):ssize_t;
  69. begin
  70. fpRecvFrom:=WinSock2.RecvFrom(S,Buf,Len,Flags,WinSock2.PSockAddr(From),FromLen);
  71. end;
  72. function fpconnect (s:cint; name : psockaddr; namelen : tsocklen):cint;
  73. begin
  74. fpConnect:=Winsock2.Connect(S,WinSock2.PSockAddr(name),nameLen);
  75. end;
  76. function fpshutdown (s:cint; how:cint):cint;
  77. begin
  78. fpShutDown:=Winsock2.ShutDown(S,How);
  79. end;
  80. Function socket(Domain,SocketType,Protocol:Longint):Longint;
  81. begin
  82. socket:=fpsocket(Domain,sockettype,protocol);
  83. end;
  84. Function Send(Sock:Longint;Const Buf;BufLen,Flags:Longint):Longint;
  85. begin
  86. send:=fpsend(sock,@buf,buflen,flags);
  87. end;
  88. Function SendTo(Sock:Longint;Const Buf;BufLen,Flags:Longint;Var Addr; AddrLen : Longint):Longint;
  89. begin
  90. sendto:=fpsendto(sock,@buf,buflen,flags,@addr,addrlen);
  91. end;
  92. Function Recv(Sock:Longint;Var Buf;BufLen,Flags:Longint):Longint;
  93. begin
  94. Recv:=fpRecv(Sock,@Buf,BufLen,Flags);
  95. end;
  96. Function RecvFrom(Sock : Longint; Var Buf; Buflen,Flags : Longint; Var Addr; var AddrLen : longint) : longint;
  97. begin
  98. RecvFrom:=fpRecvFrom(Sock,@Buf,BufLen,Flags,@Addr,@AddrLen);
  99. end;
  100. function fpbind (s:cint; addrx : psockaddr; addrlen : tsocklen):cint;
  101. begin
  102. fpbind:=Winsock2.Bind(S,Winsock2.PSockAddr(Addrx),AddrLen);
  103. end;
  104. function fplisten (s:cint; backlog : cint):cint;
  105. begin
  106. fplisten:=Winsock2.Listen(S,backlog);
  107. end;
  108. function fpaccept (s:cint; addrx : psockaddr; addrlen : psocklen):cint;
  109. begin
  110. fpAccept:=Winsock2.Accept(S,Winsock2.PSockAddr(Addrx), AddrLen);
  111. end;
  112. function fpgetsockname (s:cint; name : psockaddr; namelen : psocklen):cint;
  113. begin
  114. fpGetSockName:=Winsock2.GetSockName(S,Winsock2.TSockAddr(name^),nameLen^);
  115. end;
  116. function fpgetpeername (s:cint; name : psockaddr; namelen : psocklen):cint;
  117. begin
  118. fpGetPeerName:=Winsock2.GetPeerName(S,Winsock2.TSockAddr(name^),NameLen^);
  119. end;
  120. function fpgetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen : psocklen):cint;
  121. begin
  122. fpGetSockOpt:=Winsock2.GetSockOpt(S,Level,OptName,OptVal,OptLen^);
  123. end;
  124. function fpsetsockopt (s:cint; level:cint; optname:cint; optval:pointer; optlen :tsocklen):cint;
  125. begin
  126. fpSetSockOpt:=Winsock2.SetSockOpt(S,Level,OptName,OptVal,OptLen);
  127. end;
  128. function fpsocketpair (d:cint; xtype:cint; protocol:cint; sv:pcint):cint;
  129. begin
  130. fpsocketpair:=-1;
  131. WSASetLastError(EOPNOTSUPP); // so that wsagetlasterror retrieves it
  132. end;
  133. Function CloseSocket(Sock:Longint):Longint;
  134. begin
  135. result := Winsock2.CloseSocket (Sock);
  136. end;
  137. Function Bind(Sock:Longint;Const Addr;AddrLen:Longint):Boolean;
  138. begin
  139. bind:=fpBind(Sock,@Addr,AddrLen)=0;
  140. end;
  141. Function Listen(Sock,MaxConnect:Longint):Boolean;
  142. begin
  143. Listen:=fplisten(Sock,MaxConnect)=0;
  144. end;
  145. Function Accept(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  146. begin
  147. Accept:=FPAccept(sock,@addr,@addrlen);
  148. end;
  149. Function Shutdown(Sock:Longint;How:Longint):Longint;
  150. begin
  151. shutdown:=fpshutdown(sock,how);
  152. end;
  153. Function Connect(Sock:Longint;Const Addr;Addrlen:Longint):Boolean;
  154. begin
  155. connect:=fpconnect(sock,@addr,addrlen)=0;
  156. end;
  157. Function GetSocketName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  158. begin
  159. GetSocketName:=fpGetSockName(sock,@addr,@addrlen);
  160. end;
  161. Function GetPeerName(Sock:Longint;Var Addr;Var Addrlen:Longint):Longint;
  162. begin
  163. GetPeerName:=fpGetPeerName(Sock,@addr,@addrlen);
  164. end;
  165. Function GetSocketOptions(Sock,Level,OptName:Longint;Var OptVal;Var optlen:longint):Longint;
  166. begin
  167. GetSocketOptions:=fpGetSockOpt(sock,level,optname,@optval,@optlen);
  168. end;
  169. Function SetSocketOptions(Sock,Level,OptName:Longint;Const OptVal;optlen:longint):Longint;
  170. begin
  171. SetSocketOptions:=fpsetsockopt(sock,level,optname,@optval,optlen);
  172. end;
  173. Function SocketPair(Domain,SocketType,Protocol:Longint;var Pair:TSockArray):Longint;
  174. begin
  175. SocketPair:=fpsocketpair(domain,sockettype,protocol,@pair[1]);
  176. end;
  177. function fpWrite(handle : longint;Const bufptr;size : dword) : dword;
  178. begin
  179. fpWrite := dword(Winsock2.send(handle, bufptr, size, 0));
  180. if fpWrite = dword(winsock2.SOCKET_ERROR) then
  181. fpWrite := 0;
  182. end;
  183. function fpRead(handle : longint;var bufptr;size : dword) : dword;
  184. var
  185. d : dword;
  186. begin
  187. if ioctlsocket(handle,FIONREAD,@d) = winsock2.SOCKET_ERROR then
  188. begin
  189. fpRead:=0;
  190. exit;
  191. end;
  192. if d>0 then
  193. begin
  194. if size>d then
  195. size:=d;
  196. fpRead := dword(Winsock2.recv(handle, bufptr, size, 0));
  197. if fpRead = dword(winsock2.SOCKET_ERROR) then
  198. fpRead := 0;
  199. end;
  200. end;
  201. {$i sockets.inc}
  202. { Winsocket stack needs an init. and cleanup code }
  203. var
  204. wsadata : twsadata;
  205. initialization
  206. WSAStartUp($2,wsadata);
  207. finalization
  208. WSACleanUp;
  209. end.